Ефективне оброблення великих наборів даних у Laravel за допомогою streamJson()

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 28 листопада, 2024
Коли ви працюєте з великими наборами даних у додатках Laravel, використання методу streamJson може кардинально покращити продуктивність та зменшити використання пам'яті. Дізнайтеся, як це працює та чому цей підхід є невід'ємною частиною оптимізації ваших веб-додатків

Коли ви працюєте з великими наборами даних у Laravel, відправка всієї інформації одразу може спричинити проблеми з продуктивністю та пам’яттю. Laravel пропонує елегантне рішення через метод streamJson, який дозволяє поступове формування JSON-даних. Цей підхід ідеально підходить для прогресивної доставки великих наборів даних у форматі, зручному для JavaScript.

# Розуміння streamJson()

Метод streamJson, доступний через об'єкт response у Laravel, забезпечує поступове формування JSON-даних. Це оптимізує продуктивність і використання пам’яті при роботі з великими наборами даних.

$request->streamJson(['data' => $yourDataset]);

# Практичний приклад

Розгляньмо реальний приклад, де ми управляємо великим набором даних про інвентар, що містить детальну інформацію про товари та їх взаємозв'язки.

Ось як реалізувати це за допомогою streamJson:

<?php

namespace App\Http\Controllers;

use App\Models\Inventory;
use Illuminate\Http\Request;

class InventoryController extends Controller
{
    public function list()
    {
        return response()->streamJson([
            'inventory' => Inventory::with('supplier', 'variants')->cursor()->map(function ($item) {
                return [
                    'id' => $item->id,
                    'sku' => $item->sku,
                    'quantity' => $item->quantity,
                    'supplier' => $item->supplier->name,
                    'variants' => $item->variants->pluck('name'),
                ];
            }),
        ]);
    }
}

У цьому прикладі ми використовуємо "eager loading" для зв’язків з постачальником і варіантами, щоб уникнути проблеми N+1 запитів. Метод cursor() забезпечує ефективну ітерацію по товарах, а метод map() відповідає за форматування кожного запису під час потоку.

Ось як виглядає виведений потік:

{
    "inventory": [
        {
            "id": 1,
            "sku": "INV-001",
            "quantity": 150,
            "supplier": "Global Supplies Inc",
            "variants": ["red", "blue", "green"]
        },
        {
            "id": 2,
            "sku": "INV-002",
            "quantity": 75,
            "supplier": "Quality Goods Ltd",
            "variants": ["small", "medium"]
        },
        // ... додаткові елементи інвентарю потрапляють у потік у міру обробки
    ]
}

Метод streamJson дозволяє вашому застосунку передавати дані поступово, даючи браузеру можливість почати обробку та відображення результатів ще до отримання повного набору даних.

Використання streamJson забезпечує ефективний спосіб роботи з великими наборами даних, сприяючи кращій роботі з інтерфейсом користувача завдяки швидшій первинній завантаженню та поступовим оновленням. Це стає особливо корисним при роботі з наборами даних, які занадто великі для одноразових операцій завантаження.