کار کردن با مجموعه داده های بزرگ نیازمند انعطاف پذیری بالا در نحوه دستکاری و استفاده از اونا برخورداره، درحالی که collection ها متدهای خوبی رو برای کارکردن با داده ارائه میدهند ولی برای بازدهی بیشتر نیاز داریم که بتونیم به query خودمون برگریدم.
📩 با عضویت در خبرنامه، جدیدترین مطالب و آموزشها را مستقیم در ایمیل خود دریافت کنید.
توی لاراول متد toQuery() امده که این فضای خالی رو برای ما پرکنه و کمبودش احساس نشه و collection رو به query builder تبدیل میکنه و به ما اجازه میده که عملیات سطح دیتابیسی انجام بدیم و از درخواست های متعدد به دیتابیس جلوگیری میکنه.
مثال
<?php
namespace App\Services;
use App\Models\Order;
use App\Events\OrdersProcessed;
use Illuminate\Support\Facades\DB;
class OrderProcessor
{
public function processReadyOrders()
{
$orders = Order::where('status', 'ready')
->where('scheduled_date', '<=', now())
->get();
DB::transaction(function() use ($orders) {
// Convert collection to query for bulk update
$orders->toQuery()->update([
'status' => 'processing',
'processed_at' => now()
]);
// Chain additional operations
$ordersByRegion = $orders->toQuery()
->join('warehouses', 'orders.warehouse_id', '=', 'warehouses.id')
->select('warehouses.region', DB::raw('count(*) as count'))
->groupBy('region')
->get();
event(new OrdersProcessed($ordersByRegion));
});
}
public function updatePriorities()
{
$urgentOrders = Order::where('priority', 'high')->get();
$urgentOrders->toQuery()
->select('orders.*', 'customers.tier')
->join('customers', 'orders.customer_id', '=', 'customers.id')
->where('customers.tier', 'vip')
->update(['priority' => 'critical']);
}
}
Code language: HTML, XML (xml)
به طور کلی کارهایی که توی کد بالا انجام میشه
- آپدیت دستهای داده به وسیله transaction safety (که اگر خطایی پیش آمد دیتاها به حالت قبلی برگردند به وسیله
DB::transaction). - انجام عملایت join و group بعد از آپدیت (بعد از تبدیل شدن به collection)
با استفاده از toQuery شما به صورت یکپارچه میتونید بین collection و query builder جابجا بشید و پروژه لاراولتون رو کارآمدتر کنید

