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

پشت پرده 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 من قرار بگیره .


5| از1رای

مطالب مشابه


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