🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ Mahdi
استفاده از Eager & lasy در روابط polymorphic
جامعه لاراول ایجاد شده در ۲۸ آذر ۱۴۰۱

سلام

بعد از ایجاد پلی مورفی تعداد کوئری‌ها تکراری صفحه ما به شدت بالا رفت خواستم ببینم به چه نحوی میشه از Eager یا lasy استفاده کرد؟

مثالی ک doc laravel زده

$activities = ActivityFeed::with('parentable')
    ->get()
    ->loadMorph('parentable', [
        Event::class => ['calendar'],
        Photo::class => ['tags'],
        Post::class => ['author'],
    ]);

سلام مهدی عزیز

برای اینکار میتونید استانیک متد with رو استفاده کنید یا متد load رو صدا بزنید؛حجم کوئری‌ها بشدت کاهش پیدا میکنه با این روش چون همزمان همه اطلاعات با یک کوئری اجرا میشه ولی در حالت غیر از این کوئری‌ها جدا زده میشن.


برای توضیح مثال لاراول:

ما مدل activityfeed رو با morph به نام parentable دریافت کردیم و بعد parent هر کدوم از مدل‌ها و morph‌های ایجاد شده رو مشخص کردیم که اگر parentable type هر کدوم برابر با موارد زیر بود به سراغ رابطه کدوم کلاس با کلاس دیگه بره.برای مثال گفتیم parentable typeما اگر مدل post بود تعلق مربوط به author هست و مدل post رو با author اون دریافت کردیم که morph و رابطه با activityfeed دارند.

برای اینکه کامل متوجه بشید پیشنهاد میکنم یکبار همین سورس رو تست کنید تا درکش کنید چون رابطه پیچیده ای هست.

احمدرضا فاطمی کیا ۲۸ آذر ۱۴۰۱، ۲۱:۱۳

سلام احمد جان سوال من چیزی دیگه ای بود سوال من در ارتباط استفاده از Eager در کنار polymorphic هست

از Eager و lasy هم برای کم کردن query‌های صحفه show و ایندکس استفاده کردم

این مثالی ک doc لاراول زده

$activities = ActivityFeed::with('parentable')
    ->get()
    ->loadMorph('parentable', [
        Event::class => ['calendar'],
        Photo::class => ['tags'],
        Post::class => ['author'],
    ]);

اینو چجوری روی کدهامون پیاده سازی کنیم؟ کدهای سمت trait likeable ما

trait Likeable
{
    public function likes()
    {
        return $this->morphMany(Like::class, 'likeable');
    }
}

980c-1.pngبه چه شکل میشه این کوئری‌ها رو کم کرد؟

اینم اضافه کنم ک با گذاشتن 3 کامنت این تعداد کوئری داریم ن بیشتر

Mahdi ۲۹ آذر ۱۴۰۱، ۰۶:۱۹

طبق دو روش روش زیر باید عمل کنی:

دامپ بگیر و طبق خروجی عمل کن.


Like::with('likeable')->get()
->loadmorph('likeable',[
Video::class=>['likes']
]);
//Or
$likes = Like::query()
    ->with(['likeable' => function (MorphTo $morphTo) {
        $morphTo->morphWith([
            Video::class =>['likes']
        ]);
    }])->get();
احمدرضا فاطمی کیا ۲۹ آذر ۱۴۰۱، ۰۶:۵۵

جواب نیس وقتی کدها طبق doc مینویسم صفحه لود نمیشه


Mahdi ۲۹ آذر ۱۴۰۱، ۰۷:۱۰

مهدی عزیز

حالت eager load برای این نوع polymorphic مدنظر شما وجود نداره

چون باید یک belongs to در value مدلی که معرفی میشه وجود داره و به همین دلیل هست که اکثرا پیشنهاد میشه حدالامکان از polymorph استفاده نشه.

در متد morphwith ما باید در value کلید مدل ویدیو یک likes که با belongs to مشخص شده باشه داشته باشیم و به همین دلیل هست که استاد سامی از این مورد استفاده نکردند در polymorphic.


احمدرضا فاطمی کیا ۲۹ آذر ۱۴۰۱، ۰۹:۰۶