23 septiembre, 2024
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
Tabla Producto
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.
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);
}
}
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']);
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
}
]
}
]
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 97 veces
Curso de Laravel 11 aprende a desarrollar una página web administrable
Descarga del código fuente
USD 17.00
© Copyright Codea App | LATAM | 2020 - 2024