به طور پیش فرض ، مدل های Laravel Eloquent فرض می کنند جدول شما دارای فیلدهای مهر زمان است – ایجاد شده در آن و به روز شده در آن. اما کارهای زیادی وجود دارد که می توانید برای شخصی سازی آنها یا انجام برخی کارهای جالب انجام دهید. بیا یک نگاهی بیندازیم.
1. مهر زمان را غیرفعال کنید
اگر جدول DB شما آن قسمت ها را ندارد ، و سعی خواهید کرد کاری مانند آن انجام دهید مدل :: ایجاد ($ arrayOfValues)؛ – خطای SQL دریافت خواهید کرد. لاراول تلاش می کند تا بصورت خودکار در_ Created_at / updated_at را پر کند و آنها را پیدا نمی کند.
برای غیرفعال کردن زمان سنجی خودکار ، در مدل Eloquent خود باید یک ویژگی اضافه کنید:
class Role extends Model
{
public $timestamps = FALSE;
// ... other model properties and methods
}
2. نام ستون Timestamp را تغییر دهید
اگر با پایگاه داده غیر لاراول کار می کنید و ستون های تایمر زمان شما متفاوت نامیده می شوند ، چه می کنید؟ شاید ، شما داشته باشید ایجاد_زمان و به روز رسانی. خوشبختانه ، شما می توانید آنها را در مدل نیز مشخص کنید:
class Role extends Model
{
const CREATED_AT = 'create_time';
const UPDATED_AT = 'update_time';
3. قالب تاریخ / زمان را انتخاب کنید
در اینجا ، من فقط نقل قول می کنم اسناد رسمی لاراول:
قبل از لاراول 7 ، تاریخ ها به شکلی مانند شکل زیر سریال می شوند: 2019-12-02 20:01:00
. از لاراول 7 ، تاریخ های سری شده با قالب جدید به صورت زیر ظاهر می شوند: 2019-12-02T20:01:00.283041Z
. اگر می خواهید قالب مهر زمان را سفارشی کنید ، تنظیم کنید $dateFormat
ویژگی در مدل شما. این ویژگی نحوه ذخیره ویژگی های تاریخ در پایگاه داده و همچنین قالب آنها هنگام سریال سازی مدل در آرایه یا JSON را تعیین می کند:
class Flight extends Model
{
/**
* The storage format of the model's date columns.
*
* @var string
*/
protected $dateFormat="U";
}
4. Many-to-Many: جدول محوری با مهر زمان
کمی استثنا برای اتوماسیون مهر زمان است که شما ایجاد کنید جدول محوری در روابط بسیاری به بسیاری، مانند میز نقش_کاربر بین کاربران و نقش ها میزها
در مدل ، شما رابطه را اینگونه تعریف می کنید:
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
و سپس ، هنگامی که می خواهید نقشی را به یک کاربر اضافه کنید ، چنین کاری انجام می دهید:
$roleID = 1;
$user->roles()->attach($roleID);
به طور پیش فرض ، آن جداول محوری حاوی مهر زمان نیست. و لاراول در این مورد سعی در پر کردن ایجاد_ات / به روز شده در آن ندارد.
اما اگر می خواهید مهر زمان را به طور خودکار ذخیره کنید ، باید آنها را در پرونده مهاجرت اضافه کنید و سپس رابطه را با استفاده از آن تعریف کنید -> withTimestamps () ؛
public function roles()
{
return $this->belongsToMany(Role::class)->withTimestamps();
}
5. سفارش توسط Timestamp با جدیدترین () و قدیمی ترین ()
برای سفارش داده ها با مهر زمان دو «میانبر» وجود دارد.
بجای:
User::orderBy('created_at', 'desc')->get();
می توانید سریعتر این کار را انجام دهید:
User::latest()->get();
به صورت پیش فرض، آخرین() سفارش خواهد داد ایجاد شده در.
یک روش مخالف وجود دارد قدیمی ترین () که به سفارش ایجاد شده_در حال صعود.
User::oldest()->get();
همچنین ، می توانید ستون دیگری را برای سفارش تعیین کنید. به عنوان مثال ، اگر می خواهید استفاده کنید به روز شده در، می توانید این کار را انجام دهید:
$lastUpdatedUser = User::newest('updated_at')->first();
6. بدون لمس updated_at به روزرسانی کنید
هر زمان رکورد Eloquent را به روز کنید ، به طور خودکار مهر زمان فعلی را در آن ذخیره می کند به روز شده در ستون ، و این یک ویژگی عالی است.
اما گاهی اوقات می خواهید از آن اجتناب کنید ، مانند اینکه مقداری را افزایش می دهید و نمی خواهید آن را “به روزرسانی کامل رکورد” در نظر بگیرید.
سپس ، شما باید همان روش بالا را انجام دهید – مهر زمان را غیرفعال کنید ، اما فقط برای آن یک بار:
$user = User::find(1);
$user->profile_views_count = 123;
$user->timestamps = false;
$user->save();
7. Touch و Parent Touch
در مقابل مثال آخر – شاید شما می خواهید مقدار جدید را فقط “” تنظیم کنید به روز شده در ستون ، و دیگران را تغییر ندهید.
بنابراین ، به جای:
$user->update(['updated_at' => now()]);
می توانید از روش کوتاه تری استفاده کنید:
$user->touch();
مورد دیگر – گاهی اوقات می خواهید نه تنها تنظیم کنید به روز شده در از مدل فصیح فعلی ، بلکه همچنین است والدین ثبت توسط رابطه.
مثلاً اگر بعضی اظهار نظر به روز شد ، پس می خواهید آن را در نظر بگیرید پست رکورد باید جدید داشته باشد به روز شده در، هم.
سپس ، شما باید مدل های “والد لمسی” را در مدل Eloquent تعریف کنید:
class Comment extends Model {
protected $touches = ['post'];
public function post()
{
return $this->belongsTo('Post');
}
}
8. فیلدهای زمان بند به صورت خودکار کربن هستند
آخرین نکته “جایزه” – بیشتر شبیه “یادآوری” است زیرا باید در مورد آن بدانید.
به طور پیش فرض ، هر دو ایجاد شده در و به روز شده در بازیگران هستند به عنوان $ خرما از مدل Eloquent ، بنابراین می توانید عملیات Carbon را بدون تبدیل شدن به نمونه Carbon بر روی آنها انجام دهید.
مثلا:
$user->created_at->addDays(3);
now()->diffInDays($user->updated_at);
همین ، نکاتی سریع اما امیدوارم مفید!