دسته بندی : فریم ورک LARAVEL

تفاوت with و has در لاراول

with

خیلی پیش تر احتمالا با عبارات eager ها آشنا شده بودید وقتی ما از eager استفاده میکنیم لاراول به جدول ها و رابطه های که ما میخواییم JOIN میزنه و در یه کوئری اطلاعات رو واکشی میکند و به ما نمایش میدهد و ما چیزی به اسم withCount هم داریم که بعد از join زدن به طرف رابطه ما تعداد رو بر میگرداند پس تا اینجا متوجه این شده ایم کار این متد join زدن هستش ! وقتی ما میخواهیم این متد رو کاستوم کنیم تا مقدایر خاصی رو بده از کالبک استفاده میکردیم مثلا :

withCount(["user" => callback ]) ;
with(["user" => callback ) ;
// ex 
User::with([ "post" => function ($query) {
    return $query->id % 2 = 0 ; 
}]) ;

تو مثال بالا زمانی که در رابطه ما با پست ها فقط آیدی های زوج هر کاربر رو بر میگرداند این زمانی خوب هست ما میخواهیم فیلتری انجام بدیم و ریلیشن کاربرها رو بررسی کنیم .

has

این تابع کار موجود بودن در ریلیشن رو بررسی میکند و وقتی طرف اول ریلیشن خاصیت رو نداشت طرف اول رو از گردونه حذف میکند مثلا چی !

مثلا ما در کاربرا کسانی که پستی افزودن دارند رو میخواهیم نشون بدیم ! ما نمیتونیم از withCount استفاده کنیم و بگیم تعداد تمام پست های یوزر رو بشمار و داخل حلقه بیا تفکیک کن ! هزینه این کار خیلی بالاس . در sql ما در این مواقع از where Exists استفاده میکنیم کار has دقیقا اینه ما به وسیله has میتونیم در صورت وجود داشتن رابطه طرف اول ریلیشن رو نشون بدیم !

مثلا برای مثال بالا ما داریم .

User::has("posts") ;

has به همینجا ختم نمیشه و بعد بزرگتری داره ! شما میتونید بگید اگر کاربری بیشتر از ۵ تا پست داره رو نشون بده شما برای این کار باید :

User::has("posts" , ">" , 5 ) ;

الکونت واقعا زیباس ! ولی الکونت has رو به اینجا محدود نمیکنه شما میتونید بگید من کاربرانی میخوام که تعداد پست های که ایدی زوج داشتند بیشتر از ۵ باشد !

User::has("posts" ,function ($query) {
    return $query->id % 2 = 0 ; 
}, ">" , ۵ ) ;

4| از2رای

مطالب مشابه


0 دیدگاهافزودن