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 374 veces | 0 usuarios

Código fuente no disponible.

Compartir link del tutorial con tus amigos


Laravel Página Web Administrable

USD 17.00

Descarga del código fuente

Laravel Página Web Administrable
Curso de Laravel básico

USD 17.00

Descarga del código fuente

Curso de Laravel básico

Más tutoriales de Laravel

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú

© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2024