ناشناس
سوال 325
فرق بین with و has در لاراول چیست؟
ثبت پاسخ جدید
برای ثبت پاسخ، لطفا وارد حساب کاربری خود شوید.
پاسخها
1 پاسخهنگامی که از with در هنگام دریافت داده از بانک اطلاعاتی استفاده می کنیم، میاد اطلاعات مرتبط رو هم همزمان میگیره.
برای مثال عبارت زیر رو در حالتی که جدول مربوط به مدل city یک ستون به اسم province_id داشته باشه نظر بگیرید:
در هنگام دریافت اطلاعات میاد بررسی میکنه که در ستون province_id چه اعدادی اومده، اونها یکتا میکنه و از جدول مربوطه اطلاعات رو می خونه و میشه برای تک تک داده ها مستقیم به اطلاعات جدول مرتبط دسترسی داشته باشیم.
این روش برای رفع مشکل n+۱ کوئری که معمولا دردسر ساز هست کمک بسیار موثر محسوب میشه و قطعا با join تفاوت داره.
یک ویژگی دوست داشتنی در تابع with امکان استفاده بعد از دریافت داده هست. مثلا
has
این تابع کار موجود بودن در ریلیشن رو بررسی میکنه و وقتی طرف اول ریلیشن خاصیت رو نداشت طرف اول رو از گردونه حذف میکند مثلا چی !
مثلا ما در کاربرا کسانی که پستی افزودن دارند رو میخوایم نشون بدیم ! ما نمیتونیم از withCount استفاده کنیم و بگیم تعداد تمام پست های یوزر رو بشمار و داخل حلقه بیا تفکیک کن ! هزینه این کار خیلی بالاس . در sql ما در این مواقع از where Exists استفاده میکنیم کار has دقیقا اینه ما به وسیله has میتونیم در صورت وجود داشتن رابطه طرف اول ریلیشن رو نشون بدیم !
مثلا برای مثال بالا ما داریم .
has به همینجا ختم نمیشه و بعد بزرگتری داره ! شما میتونید بگید اگر کاربری بیشتر از ۵ تا پست داره رو نشون بده شما برای این کار باید :
الکونت واقعا زیباس ! ولی الکونت has رو به اینجا محدود نمیکنه شما میتونید بگید من کاربرانی میخوام که تعداد پست های که ایدی زوج داشتند بیشتر از ۵ باشد !
برای مثال عبارت زیر رو در حالتی که جدول مربوط به مدل city یک ستون به اسم province_id داشته باشه نظر بگیرید:
در هنگام دریافت اطلاعات میاد بررسی میکنه که در ستون province_id چه اعدادی اومده، اونها یکتا میکنه و از جدول مربوطه اطلاعات رو می خونه و میشه برای تک تک داده ها مستقیم به اطلاعات جدول مرتبط دسترسی داشته باشیم.
این روش برای رفع مشکل n+۱ کوئری که معمولا دردسر ساز هست کمک بسیار موثر محسوب میشه و قطعا با join تفاوت داره.
یک ویژگی دوست داشتنی در تابع with امکان استفاده بعد از دریافت داده هست. مثلا
has
این تابع کار موجود بودن در ریلیشن رو بررسی میکنه و وقتی طرف اول ریلیشن خاصیت رو نداشت طرف اول رو از گردونه حذف میکند مثلا چی !
مثلا ما در کاربرا کسانی که پستی افزودن دارند رو میخوایم نشون بدیم ! ما نمیتونیم از withCount استفاده کنیم و بگیم تعداد تمام پست های یوزر رو بشمار و داخل حلقه بیا تفکیک کن ! هزینه این کار خیلی بالاس . در sql ما در این مواقع از where Exists استفاده میکنیم کار has دقیقا اینه ما به وسیله has میتونیم در صورت وجود داشتن رابطه طرف اول ریلیشن رو نشون بدیم !
مثلا برای مثال بالا ما داریم .
has به همینجا ختم نمیشه و بعد بزرگتری داره ! شما میتونید بگید اگر کاربری بیشتر از ۵ تا پست داره رو نشون بده شما برای این کار باید :
الکونت واقعا زیباس ! ولی الکونت has رو به اینجا محدود نمیکنه شما میتونید بگید من کاربرانی میخوام که تعداد پست های که ایدی زوج داشتند بیشتر از ۵ باشد !