چند ترفند برای Laravel Timestamps

به طور پیش فرض ، مدل های Laravel Eloquent فرض می کنند جدول شما دارای ستون های created_at و updated_at است. البته لاراول برای شما امکاناتی فراهم کرده تا این فیلدها را شخصی سازی کنید و یا کارهای جالبی با آن ها انجام دهید.

غیر فعال کردن Timestamps

اگر جدول دیتابیس شما ستون های مربوط به زمان ایجاد و یا زمان آپدیت را نداشته باشد و شما سعی کنید کد Model::create($arrayOfValues); را اجرا کنید، خطای SQL دریافت خواهید کرد. لاراول تلاش خواهد کرد تا بصورت خودکار فیلدهای Created_at / updated_at را پر کند اما آنها را پیدا نمی کند.

برای غیرفعال کردن پر شدن خودکار این فیلدها، در مدل Eloquent خود باید یک ویژگی اضافه کنید:

class Role extends Model{
	public $timestamps = FALSE;
	// ... other model properties and methods
}

تغییر نام ستونTIMESTAMP 

در صورتی که جدول شما برای سنجش زمان ایجاد و آپدیت از نام های دیگری استفاده می کند شما می توانید به صورت زیر این دو نام پیش فرض را تغییر دهید.

class Role extends Model{
    const CREATED_AT = 'create_time';
    const UPDATED_AT = 'update_time'; 

تغییر فرمت Date/Time

اگر می خواهید فرمت timestamps را تغییر دهید ویژگی $dateFormat در مدل خود را به فرمت دلخواه تنظیم کنید. این ویژگی نحوه ذخیره ویژگی های تاریخ در دیتابیس و همچنین فرمت آنها هنگام سریالایز شدن مدل در آرایه یا JSON را تعیین می کند:

class Flight extends Model
{
    /**
     * The storage format of the model's date columns.
     *
     * @var string
     */
    protected $dateFormat="U";
}

:MANY-TO-MANY  جدول Pivot به همراه Timestamps

لاراول در پرکردن خودکار ستون های زمان استثناهایی هم قائل شده است. برای مثال زمانی که از جدول Pivot برای رابطه many-to-many استفاده می کنید. مثل جدول role_user که جداول users و roles را به هم مرتبط می کند. در مدل خود، رابطه را به صورت زیر تعریف می کنید:

class User extends Model{
	public function roles(){
	 return $this->belongsToMany(Role::class);
	 }
}

و سپس، هنگامی که می خواهید نقشی را به یک کاربر اضافه کنید، چنین کاری انجام می دهید:

$roleID = 1;$user->roles()->attach($roleID);

در لاراول به طور پیش فرض، جدول pivot ستون timestamps ندارد و لاراول نیز تلاشی برای پر کردن ستون های زمان نمی کند.اما اگر می خواهید timestamps را به طور خودکار ذخیره کنید، باید آنها را در فایل migration اضافه کنید و سپس در جایی که رابطه را تعریف کرده اید 

->withTimestamps(); را اضافه کنید:

public function roles(){
 return $this->belongsToMany(Role::class)->withTimestamps();
 }

مرتب سازی Timestamps با latest() و oldest()

برای مرتب سازی timestamps دو میانبر وجود دارد.

بجای:

User::orderBy('created_at', 'desc')->get();

می توانید بنویسید:

User::latest()->get();

برای انجام عکس این عمل و مرتب سازی براساس قدیمی ترین می توانید بنویسید:

User::oldest()->get();

این مرتب سازی ها به صورت پیش فرض براساس ستون created_at ایجاد می شوند و در صورتی که می خواهید این کار براساس updated_at صورت گیرد به صورت زیر عمل کنید:

$lastUpdatedUser = User::newest('updated_at')->first();

بروزرسانی خودکار updated_at

هر زمان که به کمک دستورات Eloquent ستونی را در جدول خود بروزرسانی می کنید، به طور خودکار ستون updated_at نیز بروزرسانی می شود. در صورتی که می خواهید از این ویژگی استفاده نکنید کافی است در زمان بروزرسانی جدول دیتابیس به صورت زیر عمل کنید:

$user = User::find(1);
$user->profile_views_count = 123;
$user->timestamps = false;
$user->save();
0 دیدگاه
برای قرار دادن دیدگاه وارد شوید

رسول علیزاده

سلام دنیا