مدیریت بهینه دادههای حجیم در لاراول با استفاده از streamJson
لاراول یه راهحل خیلی جالب برای این کار پیشنهاد میده به اسم *streamJson*.
این قابلیت زمانی به کمک شما میاد که نیاز دارید به تدریج دیتاها رو در قالب *json* به کاربر ارائه بدید 😁.
> این قالبت توی **Laravel 10.43** ارائه شده و باید قبل از هرکاری پروژه خودتون رو آپدیت کنید!
## درک streamJson
متد *streamJson* توی لاراول، که از طریق **Response** قابل دسترسیه، بهت این امکان رو میده که دادههای **JSON** رو مرحلهبهمرحله استریم کنی. این روش باعث میشه برنامه سریعتر و
کممصرفتر از نظر حافظه کار کنه و برای کار با دیتاستهای بزرگ یه گزینهی عالی باشه.
“`php
response()->streamJson([‘data’ => $yourDataset]);
“`
## مثال واقعی
بیاید یه مثال واقعی بزنیم، فرض کنید قراره یه لیست خیلی بزرگ از محصولات پروژه رو به کاربر نشون بدید با بعضی از رابطههاش.
“`php
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** استفاده کردیم که از درخواست اضافه به دیتابیس جلوگیری کنیم.
از متد *cursor* هم استفاده کردیم که نیاز نباشه دادهها رو یکجا از دیتابیس بگیرم.
> در واقع متد **cursor** یه connection با دیتابیس برقرار میکنه و ایتم هارو یک به یک از دیتابیس میخونه و **stream** میکنه و با کمبود حافظه مواجه نمیشیم.
خروجی کد بالا میشه
“`json
{
\”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\”]
},
// … other inventories
]
}
“`
متد **streamJson** این امکان رو به پروژه شما اضافه میکنه که داده هارو به تدریج ارسال کنه و به مرورگر امکان نمایش دیتاها قبل از کامل شدنشون رو میده.
این متد یک راه حل خیلی عالی و ارزشمند برای کار با دیتاهای بزرگ به شما ارائه میده 😁
امیدوارم از این مقاله خوشتون آمده باشه 👋
