در صورتی که از فریم ورک لاراول برای ساخت اپلیکیشنهای تحت وب خود بهره میبرید، میتوانید از قابلیتهای کارآمدی که در نسخه ۶ این فریم ورک ارائه شده است برای بهبود طراحیهای خود استفاده کنید.
یکی از این قابلیتها استفاده از ساب کوئریها (Subquery) در پایگاه داده لاراول است که میتوانیم با استفاده از آنها، میزان حافظه مصرفی برنامههای کاربردی، مدت زمان مورد نیاز Eloquent برای پردازش مدلها و همچنین تعداد کوئریهای پایگاه داده را به میزان قابل توجهی کاهش دهیم.
یکی از روشهای کارآمد در کار با پایگاه داده لاراول، استفاده از ساب کوئری (Subquery) است. Subqueryها به شما این امکان را میدهند که بتوانید کوئریهای تو در تو را در داخل یک کوئری دیگر از پایگاه داده اجرا کنید. زمانی که بازیابی دادهها با استفاده از روابط Eloquent امکان پذیر نباشد، میتوان با استفاده از ساب کوئریها دادههای مدلهای جانبی را بدون ایجاد هر گونه کوئری اضافه در پایگاه داده بازیابی کرد. همچنین، میتوان از ساب کوئریها در دستورالعملهای order by
، where
و سایر دستوالعملهای پایگاه داده استفاده کرد.
در کنفرانس لاراکون ۲۰۱۹ چند ماکرو مربوط به کوئری بیلدر ارائه شد که با اضافه شدن آنها به هسته مرکزی فریم ورک لاراول، استفاده از Subqueryها راحتتر خواهد شد. در ادامه مقاله در لیداوب، توضیحاتی راجع به هر یک از آنها ارائه شده است.
ساب کوئری های “Select” در لاراول ۶
پشتیبانی استفاده از ساب کوئریها در متدهای کوئری بیلدر select()
و addSelect()
اضافه شده است. مثالی را در نظر بگیرید که در آن، ما یک جدول مقصدهای پرواز (destinations
) و یک جدول پرواز به مقصدها (flights
) داریم. جدول flights
شامل یک ستون arrived_at
میباشد که زمان رسیدن پرواز به مقصد را نمایش میدهد.
با استفاده از قابلیت جدید subquery select در لاراول ۶، میتوانیم با استفاده از یک کوئری واحد، تمام مقاصد و نام پروازهایی را که اخیراً به آن مقاصد رسیدهاند را بازیابی کنیم:
return Destination::addSelect(['last_flight' => Flight::select('name')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
])->get();
توجه کنید که ما چکونه از Eloquent لاراول برای ایجاد ساب کوئریها بهره میبریم که باعث ایجاد یک سینتکس ساده و روان میشود. شما همچنین میتوانید این کار را با استفاده از query builder نیز انجام دهید:
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” در لاراول ۶
علاوه بر این، استفاده از ساب کوئریها در متد 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” در لاراول ۶
امکان استفاده از ساب کوئریها در متد from()
مربوط به کوئری بیلدر نیز ارائه شده است. به عنوان مثال، ممکن است بخواهید میانگین کمکهای مالی پرداخت شده توسط کاربران را در برنامه خود محاسبه کنید. با این حال، در SQL استفاده از توابع به این صورت امکان پذیر نیست:
AVG(SUM(amount))
به جای آن، میتوانیم از یک from query برای محاسبه این موارد استفاده کنیم:
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, $as = null, $connection = null)
تغییر یافته است.
امیدوارم این مقاله نیز برای شما مفید بوده باشد. اگر علاقمند به فریم ورک لاراول و یادگیری طراحی اپلیکیشنهای تحت وب با این فریم ورک هستید، میتوانید مقالات کاربردی ما را در لیداوب دنبال کنید.
دیدگاه ها
متاسفانه فقط اعضای سایت قادر به ثبت دیدگاه هستند
ورود به سایت