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.