Eloquent Relation One To One
Relaci贸n uno a uno
Para la relaci贸n uno a uno
Crear Nuevo modelo
Creamos un nuevo modelo con su tabla de migraci贸n.
php artisan make:model Category -m
Tabla Campos
Crear los campos.
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
Migrar
php artisan migrate
Agregar la Llave For谩nea
Agregar la llave for谩nea. Usamos convenci贸n de laravel. $table->foreignId('category_id')->constrained('categories'); como podemos ver tiene que ser el nombre del modelo con min煤sculas un guion bajo y id.
En database/migrations/2024_05_18_163224_create_blogs_table.php
Schema::create('blogs', function (Blueprint $table) {
$table->id();
$table->foreignId('category_id')->constrained('categories');
$table->string('title');
$table->text('body');
$table->boolean('status');
$table->timestamps();
});
Migrar con fresh
php artisan migrate:fresh
Orden de las migraciones
Para poder ejecutar la orden $table->foreignId('category_id')->constrained('categories'); tenemos que:
Asegurarnos que la migraci贸n de la tabla de categories este antes de la de blogs.
Si ya creamos la tabla blogs antes de la tabla de categories, lo que ppodemos hacer es cambiar el tiempo en el nombre de las migraciones para que quede primero la tabla de categories antes de la tabla de blogs.
Ventajas de Usar foreignId()
Una de las ventajas de usar foreignId() es que ya queda registrado en la base de datos la relaci贸n.
Crear algunas Categor铆as
Crear algunas categor铆as manualmente.
- Tech
- Sports
- Education
Crear algunos blogs
Crear la relaci贸n en Modelo
Un post solo puede tener una categor铆a por eso podemos usar una relacion uno a uno.
Hay dos tipos de relacioni uno a uno que podemos usar en laravel, hasone y belogsto , en nuestro caso sabemos que category_id belogs to an id en la tabla de categories.
En app/Models/Blog.php
class Blog extends Model
{
use HasFactory;
protected $table = 'blogs';
public function category(){
return $this->belongsTo(Category::class);
}
}
Para Desplegar el Nombre de la Categor铆a
En el controlador podemos colocar c贸digo para que nos regresa el objeto.
En app/Http/Controllers/BlogController.php
public function index()
{
$blog = Blog::find(1);
$nombreCategoria = $blog->category;
// return $blog;
return $nombreCategoria;
// return $nombreCategoria->name;
}
Objeto $blog Regresa:
id: 1,
category_id: 1,
title: "Este es un titulo Tech",
body: "Este es un body Tech",
status: 1,
created_at: null,
updated_at: null,
category: {
id: 1,
name: "Tech",
created_at: null,
updated_at: null
}
Objeto $nombreCategoria Regresa:
id: 1,
name: "Tech",
created_at: null,
updated_at: null
Objeto $nombreCategoria->name Regresa:
Tech
Para Get todos los blog incluyendo todas sus categor铆as.
Para Get todos los blog incluyendo todas sus categor铆as. Lo que podemos usar el eger loading de laravel donde tambi茅n hacemos fetch de los objetos relacionados. Usamos el m茅todo with().
$blog = Blog::with('category')->get();
return $blog;
Obtenemos:
{
id: 1,
category_id: 1,
title: "Este es un titulo Tech",
body: "Este es un body Tech",
status: 1,
created_at: null,
updated_at: null,
category: {
id: 1,
name: "Tech",
created_at: null,
updated_at: null
}
},
{
id: 2,
category_id: 2,
title: "Este es Titulo Sports",
body: "Este es Body Sports",
status: 1,
created_at: null,
updated_at: null,
category: {
id: 2,
name: "Sports",
created_at: null,
updated_at: null
}
},
{
id: 3,
category_id: 3,
title: "Este es titulo Education",
body: "Este es body Education",
status: 1,
created_at: null,
updated_at: null,
category: {
id: 3,
name: "Education",
created_at: null,
updated_at: null
}
}
Desplegar solo titulos
Ya como tenemos los objetos que necesitamos podemos.
En app/Http/Controllers/BlogController.php
$blog = Blog::with('category')->get();
foreach ($blog as $key => $value) {
echo $value->title;
echo ' - ';
echo $value->category->name;
echo '<br>';
}
Listo.


