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