اگر شما هم از افرادی هستید که مدت زیادی است از لاراول در اپلیکیشنهای خود استفاده میکنید ، این نکته را میدانید که در لایه دیتابیس لاراول میتوان کارها و تغییرات زیادی انجام داد . به عنوان مثال اغلب میتوانیم با انجام برخی کارها تعداد کوئریهای دیتابیس را کاهش دهیم و در نتیجه آن مقدار حافظهای که اپلیکیشن ما استفاده میکند را کاهش دهیم که این کار باعث میشود مقدار زمان مورد نیاز 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) تغییر کردهاست.
بیشتر بدانید
اگر شما به کسب اطلاعات بیشتر در مورد سابکوئریها و همچنین تکنولوژیهای پیشرفته دیتابیس علاقه دارید میتوانید این وبلاگ را مطالعه کنید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید