Перетворення колекцій на запити в Laravel за допомогою toQuery()

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 14 грудня, 2024
В роботі з великими наборами даних у Laravel важливо мати можливість гнучко маніпулювати інформацією. У нашій статті ми розкриємо, як метод toQuery() дозволяє перетворювати колекції на запити, покращуючи ефективність ваших баз даних. Чи готові ви зробити ваші додатки ще більш продуктивними? Читайте далі

Робота з великими наборами даних у Laravel часто вимагає гнучкості в маніпуляціях та обробці інформації. Хоча колекції надають потужні методи для роботи з масивами, бувають ситуації, коли потрібно повернутися до операцій з Query Builder для досягнення кращої продуктивності. Метод Laravel toQuery() усуває цю проблему, перетворюючи колекції назад у Query Builder, що дозволяє виконувати операції на рівні бази даних для відфільтрованих наборів даних.

# Використання toQuery()

Метод 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-додатки більш ефективними, а взаємодію з базою даних — більш гнучкою