اگر شما هم از جمله برنامه نویسانی هستید که از فریمورک لاراول برای توسعه نرم افزار خود استفاده میکنید، به احتمال زیاد با timestampها در لاراول آشنایی دارید.
به طور پیش فرض، در جداول Eloquent model لاراول دو ستون create_at و update_at وجود دارد که به آنها timestamps میگویند.برای timestamps ترفندهای زیادی وجود دارد که با استفاده از آنها میتوانیم به شخصی سازی timestamps در نرم افزار خود بپردازیم و کارها جالبی با آنان انجام دهیم.
در بعضی مواقع بنابر شرایطی مانند: افزایش سرعت دیتابیس،کاهش حجم اطاعات،عدم نیاز جدول به این فیلدها، دریافت ارورهای SQL و... نیاز میشود تا برنامه نویس timestamps را غیرفعال کند.
برای غیرفعال کردن timstamps در لاراول، ابتدا به مدل مورد نظر خود بروید و سپس ویژگی زیر را مطابق کد وارد کنید:
class Role extends Model { public $timestamps = FALSE; // ... other model properties and methods }
اگر شما مجبور باشید بر روی دیتابیسی به غیر از دیتابیس خود لاراول کار کنید و جداول آن دیتابیس از قبل دارای ستونها create_at و update_at باشند، در این صورت برای حل مشکل تشابه چه کاری باید انجام دهید؟ برای حل این مشکل میتوانید به سادگی وارد مدل خود شوید و نام ستونهای timestamps را تغییر دهید.
class Role extends Model { const CREATED_AT = 'create_time'; const UPDATED_AT = 'update_time';
تا قبل از انتشار لاراول 7، فرمت زمانی timestamps به این صورت: 20:01:00 12-02-2019 بود. پس از انتشار ورژن ۷ لاراول، این فرمت به صورت زیر درآمد:
2019-12-02T20:01:00.283041Z
در صورتی که شما بنابر هر شرایطی نیاز دارید تا این فرمت را شخصیسازی کنید، باید ویژگی dateFormat$ را در مدل مورد نظر خود تنظیم کنید. این ویژگی نحوی ذخیری دادههای زمانی در دیتابیس و همچنین فرمت آنان را مشخص میکند:
class Flight extends Model { /** * The storage format of the model's date columns. * * @var string */ protected $dateFormat = 'U'; }
برای جدول pivot در رابطهی Many-to-Many کمی تفاوت وجود دارد و به صورت پیشفرض لاراول ستونهای timestamps را برای جدول pivot قرار نمی دهد.اما گاهی اوقات نیاز است تا برای این جدول، timestamps را فعال کنیم. به عنوان مثل شما دارای دو مدل user و roles هستید و میخواید رابطهی Many-to-Many برای آنها ایجاد کنید. بنابراین کدی مانند کد زیر را مینویسید:
class User extends Model { public function roles() { return $this->belongsToMany(Role::class); } }
همانطور که گفته شد، لاراول به صورت پیشفرض برای جدول pivot ستونها Timestamps در نظز نمیگیرد. برای فعالسازی این ستونها کافی است تا کد بالا را مانند نمونهی زیر تغییر دهید:
public function roles() { return $this->belongsToMany(Role::class)->withTimestamps(); }
دو میانبر برای مرتب سازی دادهها با استفاده از timestamps وجود دارد.
به جای:
User::orderBy('created_at', 'desc')->get();
مینویسیم:
User::latest()->get();
همچنین یک متد مخالف ()latest (جدیدترین) به نام ()older (قدیمیترین) به صورت زیر وجود دارد:
User::oldest()->get();
هر دوی این متدها برای مرتب سازی از create_at استفاده میکنند.
همچنین شما میتوانید ستون دیگری برای مرتب سازی اطلاعات انتخاب کنید. برای مثال، اگر میخواهید از ستون update_at برای مرتب سازی استفاده کنید. باید از کد زیر استفاده کنید:
$lastUpdatedUser = User::newest('updated_at')->first();
هنگامی که شما یک رکورد در دیتابیس را آپدیت میکنید، ستون update_at به صورت خودکار آپدیت میشود و این یکی از مزایای لاراول به شمار میرود. اما گاهی اوقات شرایطی پیش میآید که شما نیاز دارید تا یکی از دادههای یک رکورد را آپدیت کنید بدونه آنکه بخواهید تغییری در update_at آن رکورد ایجاد شود. برای این کار مانند نمونهی زیر شما باید timestamps را فقط برای آن رکورد غیرفعال کنید:
$user = User::find(1); $user->profile_views_count = 123; $user->timestamps = false; $user->save();
برخالف آخرین مثال، شاید شما نیاز داشته باشید تا بدون ایجاد تغییر در دادههای رکورد، تنها ستون update_at آن را بروز رسانی کنید.بنابراین میتوانید
به جای:
$user->update(['updated_at' => now()]);
از کد زیر استفاده کنید:
$user->touch();
مورد دیگر، گاهی اوقات شما میخواید که در زمان تغییر update_at یک رکورد، این مورد برای والد آن رکورد که با آن رکورد دارای رابطه است، نیز تغییر کند. به عنوان مثال، اگر تعدادی کامنت برای یک پست وجود داشته باشد و آن کامنتها آپدیت شوند، update_at علاوه بر خود کامنتها برای والد آنها یعنی پست نیز آپدیت شود.
برای این کار باید به مدل کامنت رفته و کدهای زیر را به آن اضافه کنیم:
class Comment extends Model { protected $touches = ['post']; public function post() { return $this->belongsTo('Post'); } }
آخرین مورد بیشتر یک یادآوری است تا یک ترفند، اما همه کسانی که از لاراول استفاده میکنند باید آن را بدانند.
به صورت پیشفرض، create_at و update_at بر اساس پکیج Carbon هستند. بنابراین شما میتوانید عملیاتهای مختلف carbon را بدون تبدیل آنان به نمونهی carbon انجام دهید. برای مثال:
$user->created_at->addDays(3); now()->diffInDays($user->updated_at);
در این مقاله سعی شد تا ترفندهای کوچک اما مفید در مورد Timestamps در لاراول برای شما توصیف شود. امیدوارم از این نکات در نرم افزارهای لاراولی خود استفاده کنید.
اگر شما ترفند دیگری در مورد Timestamps در لاراول میشناسید، خوشحال میشویم در بخش نظرات با دیگر مخاطبان در میان بگذارد.