یکی از مهمترین مزایای فریمورک لاراول، استفاده از یک ORM قدرتمند به اسم Eloquent هست که بعیده با لاراول کرده باشی ولی با این ابزار مهم آشنا نباشی. در واقع Eloquent همون چیزیه که کار با دیتابیس و مدل ها در لاراول رو اینقدر رضایت بخش کرده.
توی این پست قراره به 5 تا از ترفندها و ویژگی های Eloquent که با وجود کاربرد زیاد، کمتر مورد توجه قرار گرفته شدند بپردازیم.
اگر یه کالکشن از مدل های eloquent در لاراول داشته باشی برای این که همه اونها رو آپدیت کنی میتونی از حلقه forach استفاده کنی و برای هر کدوم از مدل ها یک بار update رو صدا بزنی. اما راه حل هوشمندانه تر استفاده از متد toQuery هست که فقط یک بار متد update رو صدا میزنی!
// به ازای هر کاربر یک query
foreach ($users as $user) {
$user->update([
'subscription' => 'lifetime'
]);
}
// فقط یک query
$users->toQuery()->update([
'subscription' => 'lifetime'
]);
در داخل عبارت شرطی where میتونی از query builder هم استفاده کنی (به عنوان subquery)
Comment::whereIn('user_id', User::select('id')->where('admin', true));
// select * from comments where user_id in
// (select id from users where admin = 1)
میدونستی که برای relation ها در لاراول، میتونی مقدار پیش فرض در نظر بگیری؟ اینطوری دیگه نیازی نیست هربار چک کنی که مقدار اون ریلیشن null نباشه.
خودم معمولا از این ترفند برای زمان هایی که در CRUD مدلها، قصد استفاده از فرم های یکسان برای create و edit دارم استفاده میکنم. در نتیجه برای فرم create دیگه با ارور موجود نبودن مدل مواجه نمیشم
class Comment extends Model {
public function author() {
return $this->belongsTo(User::class)->withDefault(
['name' => 'Guest']
);
}
}
// now in vue instead of this
{{ $comment->author ? $comment->author->name : 'Guest' }}
// i can write this
{{ $comment->author->name }}
قطعا میدونی که در لاراول میتونی فیلدهای یک مدل eloquent رو به آرایه casts اضافه کنی تا لاراول به صورت اتوماتیک اون ها رو تبدیل کنه. ولی میدونستی که میشه به یک query خاص هم cast رو اضافه کرد؟
$users = User::select ([
'users.*',
'last_posted_at' => Post::selectRaw('MAX(created_at)')
->whereColumn('user_id', 'users.id')
])->withCasts([
'last_posted_at' => 'datetime'
])->get();
اگر بخوای چک کنی که مدلت بعد از آخرین save تغییری داشته یا نه میتونی از متد wasChanged در لاراول استفاده کنی
$user = Post::create([
'title' => 'how good is laraplus.ir',
'author' => 'sirvan',
'likes' => 0
]);
$user->author = 'Sirvan Monfared';
$user->save();
$user->wasChanged(); // true
$user->wasChanged('author'); // true
$user->wasChanged(['author', 'likes']); // true
$user->wasChanged(['title']); // false
$user->wasChanged(['title', 'author']); // true
حالا دیگه نوبت شماست. اگه ترفندی از eloquent در لاراول بلدی که احتمال میدی دیگران ندونند، در کامنت ها به اشتراک بذار