پشت پرده with در روابط ۱-n
With در رابطه های one to many
همونطوری که در پست گذاشته توضیح داده بودم کارwith بارگزاری مشتقات بود یعنی توانایی داشت در یک خط کوئری های الکوئنت , ریلیشن های موجود مدل رو لود کنه ولی بعضی مواقع ما از لاراول استفاده نمیکنیم و میخواهیم از این خواص ها با استفاده ازکدهای خام sql استفاده کنیم
خیلی ها به این باورند که دستور with در زمان استفاده فقط یک sql query تولید میکنه ! ولی این نادرسته زمان استفاده از with در رابطه های ۱ – n و n – n دستور where In اجرا میشه در جداول رابطه و کل کوئری های که سیستم جویین زده رو به ما بر میگردونه این اطلاعات به وسیله LARAVEL COLLECTION به اطلاعات کوئری اول merge میشوند ! یه نگاه کلی به کوئری های که اجرا میشود میندازیم
برای مثال ما جدولی با structure و رابطه زیر داریم :
رابطه ای بالا نمونه یک رابطه ۱ به n هست در این زمان لاراول با یه کوئری تمام کاربران رو نمایش میدهد پس اولین کوئری که اجرا میکند
SELECT * FROM users ;
همونطور که گفته بودم لاراول تمام اطلاعات جدول بالا رو در Collection قرار داده به راحتی id کاربران رو میگیره و با یک where in تمام پست های کاربران رو میگیره پس کد زیر اجرا میشه
SELECT * FROM posts WHERE IN (? , ? , ... ) ;
بعد از اینکار دوباره این کوئری اجرا شد دوباره توسط collection بر اساس user_id میاد GROUP BY میشه و داخل هر ابجکت MERGE میشود .
نقل قول شخصی : به نظر من استفاده از این روش برای گرفتن انبوه اطلاعات درست نیست و باعث فشار بر روی سرور میاره همون طور که میدونید لاراول از NESTED ها هم در WITH استفاده میکنه بعدا توضیحاتی در مورد استفاده این روش میدهم .
withCount در رابطه های one to many
راحت ترین روش پیاده کردن این کوئری اینه که شما اول بر اساس user_id بیاین group By کنید پس داریم
SELECT user_id , COUNT(*) FROM posts GROUP BY user_id
در این روش ما تعداد پست های کاربر هر کاربر همراه با user_id اون داریم پس ما میتونیم جدول کاربران رو به این جدول alisas جوین بزنیم
SELECT
users.* ,
COALESCE(posts.n , 0) as posts_count
FROM users
LEFT JOIN (
SELECT user_id , COUNT(*) AS n FROM posts GROUP BY user_id
) AS posts
ON posts.user_id = users.id
خوب همونطور که میدونید withCount هم میتونه برای فیلتر از کالبک استفاده کنه پس میتونید
SELECT user_id , COUNT(*) FROM posts conditions GROUP BY user_id
شرط گذاری کنید چه پست های رو داخل count من قرار بگیره .