پیشرفت‌های ساب‌کوئری‌ها در لاراول 6.0
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 4 دقیقه

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

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

  یکی از روش‌های عالی برای بهبود کار دیتابیس استفاده از ساب‌کوئری‌ها(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) تغییر کرده‌است.

بیشتر بدانید

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

منبع

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
4 از 1 رای

/@rezajamalzadeh901

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

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

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

رضا جمال زاده

مقالات برگزیده

مقالات برگزیده را از این قسمت میتوانید ببینید

مشاهده همه مقالات