لاراول یک فریمورک پر از امکانات است اما شما نمیتوانید تمام این امکانات را در مستندات سایت لاراول مشاهده کنید.در این مطلب قصد داریم در مورد امکاناتی از Eloquent صحبت کنیم که کمتر به آن پرداخته شده است. این امکانات به شما کمک میکند تا کدنویسی تمیز تر و خواناتری داشته باشید.
[divider]
۱۰ ویژگی مهم Eloquent
-
متد getOrginal
بعد از اینکه یک مدل Eloquent را دستکاری کنید و attribute های آن را تغییر دهید، به کمک این تابع میتوانید مقادیری که قبل از دستکاری وجود داشتند را مشاهده کنید. به نمونه کد زیر دقت کنید:
$user = App\User::first(); $user->name; //John $user->name = "Peter"; //Peter $user->getOriginal('name'); //John $user->getOriginal(); //Original $user record
[divider]
-
بررسی کنید که آیا مدل شما دستکاری شده است
گاهی ممکن است در روند کدنویسی شما برخی از attribute های یک مدل دستکاری شوند، به کمک تابع isDirty شما میتوانید بررسی کنید که مدل یا attribute های آن تغییر کردهاند یا خیر. به نمونه کد زیر توجه کنید:
$user = App\User::first(); $user->isDirty(); //false $user->name = "Peter"; $user->isDirty(); //true
[divider]
-
متد getChanges
به کمک این متد، شما میتوانید لیستی از attribute هایی که تغییر کردهاند را به دست آورید. در واقع زمانی که attribute های یک مدل تعییر کنند، تا زمانی که آن مدل save نشود، تغییرات اعمال نشدهاند. همچنین علاوه بر متد save میتوان از متد syncChanges استفاده کرد. به نمونه کد زیر توجه فرمایید:
$user->getChanges() //[ "name" => "Peter", ]
[divider]
-
سفارشی سازی ستون deleted_at
به طور پیشفرض، لاراول در زمان استفاده از soft delete ستون deleted_at را بررسی میکند. شما میتوانید بطور صریح(explicitly) این ستون را به ستون دلخواه خود تغییر دهید. کافیست ویژگی DELETED_AT مدل را که یک const است را به ستون دلخواه تغییر دهید. به نمونه کد زیر توجه کنید:
class User extends Model { use SoftDeletes; * The name of the "deleted at" column. * * @var string */ const DELETED_AT = 'is_deleted'; }
و یا به کمک تعریف یک accessor در مدل:
class User extends Model { use SoftDeletes; public function getDeletedAtColumn() { return 'is_deleted'; } }
[divider]
-
ذخیره کردن مدل و روابط اش
در بسیاری از مواقع ممکن است هم مدل تغییر کند و هم مدل دیگری که با آن در ارتباط است. به جای ذخیره کردن تک تک این مدلها برای اعمال تغییرات، میتوانید به سادگی تغییرات را ایجاد کرده و مدل مورد نظر را با تمام روابط اش ذخیره کنید. این عمل با دستور push اتفاق میافتد. به نمونه کد زیر توجه کنید:
class User extends Model { public function phone() { return $this->hasOne('App\Phone'); } } $user = User::first(); $user->name = "Peter"; $user->phone->number = '1234567890'; $user->push(); // This will update both user and phone record in DB
[divider]
-
بدست آوردن تغییرات
ممکن است در جریان کدنویسی بطور همزمان در thread دیگر، مدل شما تغییر کند. حال وقتی شما مدل را از پایگاه داده خواندید، این تغییرات جدید بر روی مدل اعمال نشده بود. برای دریافت این تغییرات، میتوان از متد fresh استفاده کرد. این متد یک نمونه از مدل را که حاوی تغییرات جدید است، به شما میدهد.
$user = App\User::first(); $user->name; // John // user record get updated by another thread. // eg: 'name' changed to // Peter. $updatedUser = $user->fresh(); $updatedUser->name; // Peter $user->name; // John
[divider]
-
بهروز رسانی تغییرات
اگر میخواهید در زمان ذخیره کردن مدل، تغییراتی که بطور همزمان بر روی مدل بوجود آمده را بر روی مدل اعمال کنید، باید از متد refresh استفاده کنید.
$user = App\User::first(); $user->name; // John // user record get updated by another thread. // eg: 'name' changed to // Peter. $user->refresh(); $user->name; // Peter
[divider]
-
مقایسه مدلها
در زمان استفاده از Eloquent به کمک متد is میتوانید بررسی کنید که آیا دو مدل یکی هستند یا خیر! برای استفاده از این متد میتوانید از نمونه کد زیر استفاده کنید:
$user = App\User::find(1); $sameUser = App\User::find(1); $diffUser = App\User::find(2); $user->is($sameUser); // true $user->is($diffUser); // false
-
کپی گرفتن از مدل(Clone)
به کمک متدل replicate شما میتوانید از مدل خود یک کپی بسازید. این مدل جدید قابل save کردن است و در صورت ذخیره کردنش شناسه منحصر به فردی بدست خواهد آورد. البته باید توجه داشته باشید که در جدول مدلتان، بجز شناسه، کلید دیگری وجود نداشته باشد.
$user = App\User::find(1); $newUser = $user->replicate(); $newUser->save();
[divider]
-
تعیین کردن attribute های مورد نیاز در متد find
زمانی که از متد find و یا findOrFail استفاده میکنید، میتوانید به کمک پارامتر دوم که یک آرایه است، attribute های مورد نیاز خود را اعلام کنید تا نتیجه حاصل، صرفا شامل همان attribute ها باشد.
$user = App\User::find(1, ['name', 'age']); $user = App\User::findOrFail(1, ['name', 'age']);
موفق و پیروز باشید…