Inicio » Blog » Laravel

23 septiembre, 2024

JSON de dos tablas con campos personalizados para una API

Para obtener un JSON de dos tablas relacionadas, como categorias y productos, con campos personalizados en Laravel, puedes usar Eloquent para definir las relaciones entre las tablas y luego personalizar los campos que quieres incluir en el JSON.

Suscríbete a nuestro canal en Youtube

Suscríbirse

Para obtener un JSON de dos tablas relacionadas, como categorias y productos, con campos personalizados en Laravel, puedes usar Eloquent para definir las relaciones entre las tablas y luego personalizar los campos que quieres incluir en el JSON.

Contexto:

Tenemos dos tablas y deseamos obtener solo los campos necesarios (id, nombre y nombreCategoria ) para una Api Rest;

Tabla Categoria

  • id
  • nombre

Tabla Producto

  • id
  • nombre
  • categoria_id

Lo que deseamos obtener una lista de productos con el nombre de la categoria es decir: id.producto, nombre.producto y nombreCategoria solo esos datos, donde no incluyamos datos adicionales o estructuras.

 

Paso 1: Definir la relación entre Categoría y Producto

Suponiendo que tienes dos modelos, Categoria y Producto, y que la relación es que una categoría tiene muchos productos (uno a muchos), debes definir la relación en el modelo Categoria.

En el modelo Categoria (app/Models/Categoria.php):

php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Categoria extends Model
{
    protected $fillable = ['nombre'];

    public function productos()
    {
        return $this->hasMany(Producto::class);
    }
}

En el modelo Producto (app/Models/Producto.php):

php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Producto extends Model
{
    protected $fillable = ['nombre', 'categoria_id'];

    public function categoria()
    {
        return $this->belongsTo(Categoria::class);
    }
}

Paso 2: Definir una ruta para obtener el JSON

En tu archivo de rutas (routes/web.php o routes/api.php si es una API):

php

use App\Http\Controllers\TuControlador;
Route::get('/', [DemoControlador::class, 'index']);

Paso 3:Consultar los datos con campos personalizados

Con with(): una forma con demasiados datos.

En el controlador, puedes hacer una consulta para obtener las categorías con sus productos y seleccionar solo los campos que necesitas. Luego devolver los datos como un JSON.

En tu controlador (app/Http/Controllers/TuControlador.php):

php

namespace App\Http\Controllers;

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

class DemoControlador extends Controller
{
    public function index()
    {
        $categorias = Categoria::with(['productos' => function($query) {
            // Selecciona campos personalizados de los productos
            $query->select('id', 'nombre', 'categoria_id');
        }])->get(['id', 'nombre']); // Selecciona campos personalizados de las categorías

        return response()->json($categorias);
    }
}

 Este método nos retorna el json donde tiene demasiados datos que no los requerimos.

[
  {
    "id": 1,
    "nombre": "Javascript",
    "productos": [
      {
        "id": 3,
        "nombre": "React JS",
        "categoria_id": 1
      },
      {
        "id": 4,
        "nombre": "Next JS",
        "categoria_id": 1
      }
    ]
  },
  {
    "id": 2,
    "nombre": "PHP",
    "productos": [
      {
        "id": 1,
        "nombre": "Wordpress",
        "categoria_id": 2
      },
      {
        "id": 2,
        "nombre": "Laravel",
        "categoria_id": 2
      }
    ]
  }
]

 

Con map(): forma compleja 

public function index(){
        $productos = Producto::all();
        $all = $productos->map(function($producto){
            $producto->nombrecategoria = $producto->categoria->nombre;
            return $producto;
        });
        return response()->json($all, 200);
    }

El resultado, lamentablemente no nos sirve, tiene muchos datos

[
  {
    "id": 1,
    "nombre": "Wordpress",
    "categoria_id": 2,
    "nombrecategoria": "PHP",
    "categoria": {
      "id": 2,
      "nombre": "PHP"
    }
  },
  {
    "id": 2,
    "nombre": "Laravel",
    "categoria_id": 2,
    "nombrecategoria": "PHP",
    "categoria": {
      "id": 2,
      "nombre": "PHP"
    }
  },
  {
    "id": 3,
    "nombre": "React JS",
    "categoria_id": 1,
    "nombrecategoria": "Javascript",
    "categoria": {
      "id": 1,
      "nombre": "Javascript"
    }
  },
  {
    "id": 4,
    "nombre": "Next JS",
    "categoria_id": 1,
    "nombrecategoria": "Javascript",
    "categoria": {
      "id": 1,
      "nombre": "Javascript"
    }
  }
]

Con Array(): una forma simple con arrays

public function index(){
        $productos = Producto::all();        
        $response = [];
        foreach($productos as $producto){
            $response[] = [
                'id' => $producto->id,
                'nombre' => $producto->nombre,
                'nombreCategoria' => $producto->categoria->nombre
            ];
        }
        return response()->json($response, 200);
    }

Este resultado JSON si satisface nuestro requerimientos de obtener el id y nombre del producto y nombre de la categoria.

[
  {
    "id": 1,
    "nombre": "Wordpress",
    "nombreCategoria": "PHP"
  },
  {
    "id": 2,
    "nombre": "Laravel",
    "nombreCategoria": "PHP"
  },
  {
    "id": 3,
    "nombre": "React JS",
    "nombreCategoria": "Javascript"
  },
  {
    "id": 4,
    "nombre": "Next JS",
    "nombreCategoria": "Javascript"
  }
]

 


Leido 97 veces

Compartir link del tutorial con tus amigos


Laravel Página Web Administrable Laravel Página Web Administrable

Curso de Laravel 11 aprende a desarrollar una página web administrable

Descarga del código fuente

USD 17.00

Aprende más sobre Laravel

Cursos de programación

© Copyright Codea App | LATAM | 2020 - 2024