پیشرفت‌های ساب‌کوئری‌ها در لاراول 6.0

ترجمه و تالیف : رضا جمال زاده
تاریخ انتشار : 25 شهریور 98
خواندن در 2 دقیقه
دسته بندی ها : لاراول

اگر شما هم از افرادی هستید که مدت زیادی است از لاراول در اپلیکیشن‌های خود استفاده می‌کنید ، این نکته را می‌دانید که در لایه دیتابیس لاراول می‌توان کارها و تغییرات زیادی انجام داد . به عنوان مثال اغلب می‌توانیم با انجام برخی کا‌رها تعداد کوئری‌های دیتابیس را کاهش دهیم و در نتیجه آن مقدار حافظه‌ای که اپلیکیشن ما استفاده می‌کند را کاهش دهیم که این کار باعث می‌شود مقدار زمان مورد نیاز Eloquent برای پردازش مدل‌مان کاهش پیدا کند ، به طور‌کلی این کار می‌تواند منجر به بهبود قابل‌توجه عملکرد اپلیکیشن شود.

پیشرفت‌های ساب‌کوئری‌ها در لاراول 6.0

  یکی از روش‌های عالی برای بهبود کار دیتابیس استفاده از ساب‌کوئری‌ها(subquery) است . ساب‌کوئری‌ها به شما اجازه می دهند که کوئری‌های تو در تو در کوئری دیگری از دیتابیس اجرا کنید.

وقتی که بازیابی اطلاعات از طریق روابط امکان پذیر نیست ، این روش می‌تواند روشی مفید و قدرتمندی برای بازیابی داده‌ها از مدل بدونه ایجاد هرگونه کوئری اضافه بر روی دیتابیس باشد ، همچنین شما می‌توانید از ساب‌کوئری‌ها به همراه کوئری   order ، where  و سایر دیتابیس  clausesها استفاده کنید.

در طول کنفرانس Laracon US 2019 به چند ماکرو کوئری بیلدر رجوع شد و از آن‌ها برای استفاده راحت‌تر از ساب‌کوئری‌ها در لاراول استفاده شد ، از زمان این رخداد سه درخواست برای اضافه شدن ساب‌کوئری‌ها به هسته‌ی فریمورک لاراول ارسال شد.

 در ادامه به معرفی اجمالی هر کدام می پردازیم.

ساب‌کوئری "select"

درخواست شماره 29567#  پشتیبانی ساب‌کوئری‌ها برای کوئری بیلدر‌های select()  و addSelect() اضافه کرد.

برای مثال ، تصور کنید که ما یک جدول از مقاصد پرواز (flight destinations) و یک جدول از پروازها به مقصد (flight to destination) داریم وهمچنین جدول پرواز‌ها شامل یک ستون به نام arraived_at (رسیدن _در) است، این ستون زمانی که پروازها به مقصد خود رسیده‌‌اند را نشان‌ می‌دهد با استفاده از ساب کوئری جدید select در لاراول 0.6 . ما می‌توانیم همه مقاصد و نام پروازی که اخیراً به مقصد رسیده‌ است  arrived_at )) را تنها با استفاده از یک کوئری دریافت کنیم:

return Destination::addSelect(['last_flight' => Flight::select('name')
    ->whereColumn('destination_id', 'destinations.id')
    ->orderBy('arrived_at', 'desc')
    ->limit(1)
])->get();

توجه کنید که ما چطور از Eloquent برای ایجاد ساب‌کوئری استفاده کردیم . این طریقه نوشتن ، سینتکس زیباتری دارد ، همچنین شما می توانید این کار را با استفاده از کوئری بیلدر به صورت زیر انجام دهید:

return Destination::addSelect(['last_flight' => function ($query) {
    $query->select('name')
        ->from('flights')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1);
}])->get();

ساب‌کوئری "order by"

در درخواست شماره 29563# ، امکان استفاده از ساب‌کوئری برای کوئری بیلدر    orderBy()  فراهم شد . در ادامه‌ی مثال بالا ما می‌توانیم از این ساب‌کوئری برای مرتب کردن مقصد براساس زمانی که آخرین پرواز به مقصد خود رسیده‌است استفاده کنیم :

return Destination::orderByDesc(
    Flight::select('arrived_at')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1)
)->get();

مانند selectها ، شما همچنین می‌توانید از کوئری بیلدر به صورت مستقیم برای ایجاد ساب‌کوئری استفاده کنید ، برای مثال شاید شما بخواهید کاربران اپلیکیشن خود را بر اساس آخرین تاریخ ورود خود مرتب کنید :

return User::orderBy(function ($query) {
    $query->select('created_at')
        ->from('logins')
        ->whereColumn('user_id', 'users.id')
        ->latest()
        ->limit(1);
})->get();

ساب‌کوئری "from"

در نهایت در درخواست  29602# ، امکان استفاده از ساب‌کوئری‌ها برای کوئری بیلدر from()  ایجاد شده‌است ، گاهی اوقات به آن جداول مشتق  (derived table)  گفته‌ می‌شود.

برای مثال ، شاید شما بخواهید که میانگین کل کمک‌های مالی کاربران در داخل اپلیکیشن را محاسبه کنید اگرچه در sql چنین چیزی با توابع زیر امکان پذیر نیست:

AVG(SUM(amount))

به جای آن می‌توانید از ساب‌کوئری‌ها برای محاسبه استفاده کنید :

return DB::table(function ($query) {

    $query->selectRaw('sum(amount) as total')

        ->from('donations')

        ->groupBy('user_id');

}, 'donations')->avg('total');

شما ممکن است که نخواهید از این ساب‌کوئری‌ها هر روز استفاده کنید ، اما در صورتی که به آن‌ها نیاز پیدا کنید ، دانستن استفاده از آن‌ها و طریقه‌ی کاربرد آن‌ها ضروری است.

 یکی از تغییراتی که باید در مورد استفاده از Eloquent در لاراول از آن آگاهی داشته‌باشید ، تغییر متد  table() در Illuminate/Database/Capsule/Manager  است ، این متد از حالت table($table, $connection = null)  به table($table, $connection = null) تغییر کرده‌است.

بیشتر بدانید

اگر شما به کسب اطلاعات بیشتر در مورد ساب‌کوئری‌ها و همچنین تکنولوژی‌های پیشرفته دیتابیس علاقه دارید می‌توانید این وبلاگ را مطالعه کنید.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید