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. img 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. img

Crear algunas Categorías

Crear algunas categorías manualmente.

  1. Tech
  2. Sports
  3. Education

img

Crear algunos blogs

Manualmente. img

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>';
}

img


Listo.