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íbirsePara 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 arrayspublic 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 1086 veces | 0 usuarios
Código fuente no disponible.
                        
                        
                
                
                
                
                            
                            
                            