Робота з великими наборами даних у Laravel часто вимагає гнучкості в маніпуляціях та обробці інформації. Хоча колекції надають потужні методи для роботи з масивами, бувають ситуації, коли потрібно повернутися до операцій з Query Builder для досягнення кращої продуктивності. Метод Laravel toQuery() усуває цю проблему, перетворюючи колекції назад у Query Builder, що дозволяє виконувати операції на рівні бази даних для відфільтрованих наборів даних.
Метод toQuery() перетворює колекції Eloquent назад у екземпляри Query Builder, що дозволяє потужно комбінувати операції:
// Проста конвертація
$users = User::where('status', 'active')->get();
$userQuery = $users->toQuery();
Сформуємо систему обробки замовлень з ефективними пакетними операціями:
<?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) {
// Перетворення колекції на запит для масового оновлення
$orders->toQuery()->update([
'status' => 'processing',
'processed_at' => now()
]);
// Додаткові операції
$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']);
}
}
Ця реалізація демонструє:
Використовуючи toQuery(), ви можете безперешкодно переходити між операціями колекцій та Query Builder, що робить ваші Laravel-додатки більш ефективними, а взаємодію з базою даних — більш гнучкою