Transmitir grandes conjuntos de datos JSON en Laravel con streamJson()

  • Publicado el 06 noviembre, 2024
  • Palabras: 239

Al trabajar con grandes conjuntos de datos en aplicaciones web, enviar todos los datos a la vez puede generar tiempos de carga prolongados y un alto uso de memoria. Laravel ofrece una solución a este problema con el método streamJson(), que permite transmitir datos JSON de forma incremental. Este enfoque es particularmente útil para grandes conjuntos de datos que deben enviarse progresivamente al navegador en un formato que JavaScript pueda analizar fácilmente.

Transmitir grandes conjuntos de datos JSON en Laravel con streamJson()

#Comprender streamJson()

El método streamJson está disponible en el objeto de respuesta en Laravel. Permite transmitir datos JSON de forma incremental, lo que puede mejorar significativamente el rendimiento y reducir el uso de memoria para conjuntos de datos grandes.

 

#Uso básico

A continuación se muestra un ejemplo sencillo de cómo utilizar streamJson:

 

use AppModelsUser;

Route::get('/users.json', function () {
    return response()->streamJson([
        'users' => User::cursor(),
    ]);
});

 

En este ejemplo, utilizamos el método cursor() de Eloquent para iterar de manera eficiente sobre la tabla de usuarios. Luego, el método streamJson() transmitirá estos datos como JSON al cliente.

#Ejemplo práctico

Consideremos un escenario en el que necesitamos transmitir un gran conjunto de datos de productos, incluidas sus categorías y etiquetas. Así es como podríamos implementarlo:

 

<?php

namespace AppHttpControllers;

use AppModelsProduct;
use IlluminateHttpRequest;

class ProductController extends Controller
{
    public function index()
    {
        return response()->streamJson([
            'products' => Product::with('category', 'tags')->cursor()->map(function ($product) {
                return [
                    'id' => $product->id,
                    'name' => $product->name,
                    'price' => $product->price,
                    'category' => $product->category->name,
                    'tags' => $product->tags->pluck('name'),
                ];
            }),
        ]);
    }
}

 

En este ejemplo, cargamos con entusiasmo las relaciones entre categorías y etiquetas para evitar problemas de consulta N+1. Luego, usamos cursor() para iterar de manera eficiente sobre los productos y map() para dar formato a cada producto a medida que lo transmitimos.

Así es como podría verse el resultado:

 

{
  "products": [
    {
      "id": 1,
      "name": "Product 1",
      "price": 19.99,
      "category": "Electronics",
      "tags": ["new", "featured"]
    },
    {
      "id": 2,
      "name": "Product 2",
      "price": 29.99,
      "category": "Clothing",
      "tags": ["sale"]
    },
    // ... more products will be streamed as they're processed
  ]
}

 

El navegador recibirá estos datos de forma incremental, lo que le permitirá comenzar a procesar y mostrar los resultados antes de que se haya transferido todo el conjunto de datos.

Al usar streamJson, puede manejar conjuntos de datos grandes de manera más eficiente, lo que brinda una mejor experiencia de usuario con tiempos de carga iniciales más rápidos y actualizaciones progresivas de la interfaz de usuario. Este enfoque es particularmente valioso cuando se trabaja con conjuntos de datos que son demasiado grandes para cargarlos todos a la vez.

Antonio Jenaro
Antonio Jenaro

Web Developer

Archivado en:

Fuente: Harris Raftopoulos

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión