رضا جمال زاده
رضا جمال زاده
خواندن ۴ دقیقه·۳ سال پیش

هشت ترفند Timestamps در لاراول

 Timestamps
Timestamps

اگر شما هم از جمله برنامه نویسانی هستید که از فریمورک لاراول برای توسعه نرم افزار خود استفاده می‌کنید، به احتمال زیاد با timestampها در لاراول آشنایی دارید.

به طور پیش‌ فرض، در جداول Eloquent model لاراول دو ستون create_at و update_at وجود دارد که به آن‌ها timestamps می‌گویند.برای timestamp‌s ترفندهای زیادی وجود دارد که با استفاده از آن‌ها می‌توانیم به شخصی سازی timestamps در نرم افزار خود بپردازیم و کار‌ها جالبی با آنان انجام دهیم.

۱-غیرفعال سازی Timestamps

در بعضی مواقع بنابر شرایطی مانند: افزایش سرعت دیتابیس،کاهش حجم اطاعات،عدم نیاز جدول به این فیلد‌ها، دریافت ارور‌های SQL و... نیاز می‌شود تا برنامه نویس timestamps را غیرفعال کند.

برای غیرفعال کردن timstamps در لاراول، ابتدا به مدل مورد نظر خود بروید و سپس ویژگی زیر را مطابق کد وارد کنید:

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

۲-تغییر نام ستون‌های Timstamps

اگر شما مجبور باشید بر روی دیتابیسی به غیر از دیتابیس خود لاراول کار کنید و جداول آن دیتابیس از قبل دارای ستون‌ها create_at و update_at باشند، در این صورت برای حل مشکل تشابه چه کاری باید انجام دهید؟ برای حل این مشکل می‌توانید به سادگی وارد مدل خود شوید و نام ستون‌های timestamps را تغییر دهید.

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

۳-تغییر فرمت تاریخ/زمان Timestamps

تا قبل از انتشار لاراول 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'; }

۴-در رابطه‌ی Many-to-Many:جدول pivot

برای جدول 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

دو میانبر برای مرتب سازی داده‌ها با استفاده از 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 به صورت خودکار آپدیت می‌شود و این یکی از مزایای لاراول به شمار می‌رود. اما گاهی اوقات شرایطی پیش می‌آید که شما نیاز دارید تا یکی از داده‌های یک رکورد را آپدیت کنید بدونه آن‌که بخواهید تغییری در update_at آن رکورد ایجاد شود. برای این کار مانند نمونه‌ی زیر شما باید timestamps را فقط برای آن رکورد غیرفعال کنید:

$user = User::find(1); $user->profile_views_count = 123; $user->timestamps = false; $user->save();

۷-متد Touch and Parent Touch

برخالف آخرین مثال، شاید شما نیاز داشته باشید تا بدون ایجاد تغییر در داده‌های رکورد، تنها ستون 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'); } }

۸-فیلدهای Timestamp به صورت خودکار بر اساس Carbon هستند

آخرین مورد بیشتر یک یادآوری است تا یک ترفند، اما همه کسانی که از لاراول استفاده می‌کنند باید آن را بدانند.

به صورت پیش‌‌فرض، create_at و update_at بر اساس پکیج Carbon هستند. بنابراین شما می‌توانید عملیات‌های مختلف carbon را بدون تبدیل آنان به نمونه‌ی carbon انجام دهید. برای مثال:

$user->created_at->addDays(3); now()->diffInDays($user->updated_at);

نتیجه‌گیری

در این مقاله سعی شد تا ترفندهای کوچک اما مفید در مورد Timestamps در لاراول برای شما توصیف شود. امیدوارم از این نکات در نرم افزارهای لاراولی خود استفاده کنید.

اگر شما ترفند دیگری در مورد Timestamps در لاراول می‌شناسید، خوشحال می‌شویم در بخش نظرات با دیگر مخاطبان در میان بگذارد.

منبع

timestamps در لاراولآموزش timestamps در لاراوللاراولغیرفعال کردن timstamps در لاراولنکاتی در مورد timestamps در لاراول
شاید از این پست‌ها خوشتان بیاید