Relaciones de Laravel Eloquent

relaciones

Relaciones de Laravel Eloquent: conceptos básicos

Laravel Eloquent admite diferentes tipos de relaciones. Estos son los conceptos básicos más cruciales para comenzar cuando eres nuevo en Eloquent.

Eloquent la capa de abstracción de la base de datos que utiliza Laravel. ¿Eres nuevo en Laravel? Entonces espero que este artículo te ayude con los primeros pasos que estás tomando con Eloquent.


Antes de seguir leyendo, es bueno saber que todos estos ejemplos cumplen con la convención de nomenclatura de Laravel.

Aquí hay algunas notas importantes que debe saber para una mejor comprensión de todo:

  • Un modelo es una representación de objeto de una fila de la base de datos.
  • Una tabla está escrita en serpiente_caso plural: article_comments
  • Una clave foránea siempre es un caso de serpiente del nombre de la tabla con id: table_name_id.
  • Un modelo es siempre singular PascalCase: ArticleComment

Los métodos de relación se escriben en camelCase singular o plural dependiendo de si la relación puede devolver varios modelos: $modelo->artículoComentarios() o $modelo->artículoComentario()

Cuando cumple con esta convención, puede omitir una gran cantidad de código porque Laravel asumirá los nombres de campo y tabla correctos. ¡Esto te ahorrara mucho tiempo!

Cuando llamas a una relación como un atributo, dependiendo de si es singular o plural, Laravel devolverá el modelo único o una colección de modelos.

Comencemos con la relación BelongsTo (pertenece a)

BelongsTo

Una publicación está escrita por un autor, por lo que la publicación pertenece al autor. En esta relación, la tabla de publicaciones tiene un campo author_id que contiene la clave externa de la tabla de autores.

En el modelo Post la relación se define así:

public function author(): BelongsTo
{
return $this->belongsTo(Author::class);
}

La conexión de una publicación con un autor se puede hacer así:

$post->author()->associate($author);
$post->author()->dissociate($author);

Cuando la relación está configurada correctamente, puede recuperar el modelo de autor de esta manera:

$post->author

La relación inversa de BelongsTo son HasMany y HasOne. Puede usar HasMany en casos como publicaciones y autores porque los autores pueden tener varias publicaciones. Puede usar HasOne en una situación en la que el autor (en este caso) necesita relacionarse solo con uno. Piense en un teléfono principal.

HasMany

Varias publicaciones están escritas por un Author, por lo que el Author HasMany (tiene muchas) publicaciones. En esta relación, la tabla de publicaciones tiene un campo author_id que contiene la clave externa de la tabla de autores.

En el modelo Author, la relación se define así:

public function posts(): HasMany
{
return $this->hasMany(Post::class);
}

La conexión de una publicación con un autor se puede hacer así:

$author->posts()->save($post);

Laravel actualizará el campo posts.author_id con la identificación del autor.

Cuando la relación está configurada correctamente, puede recuperar una colección de publicaciones como esta:

$author->posts

Cuando llame al método de relación, obtendrá un objeto HasMany que también es un generador (de consultas).

// Collection of published Post models related to $author.$author->posts()->where('published', true)->get();

HasOne

HasOne funciona exactamente igual que HasMany solo con una desviación. Eso es que Laravel siempre asume que solo hay un modelo relacionado.

Una publicación está escrita por un autor, por lo que el autor tiene una publicación. En esta relación, la tabla de publicaciones tiene un campo author_id que contiene la clave externa de la tabla de authors, al igual que HasMany.

En el modelo Autor, la relación se define así:

public function post(): HasOne
{
return $this->hasOne(Post::class);
}

Y al igual que HasMany, conectar la publicación con el autor se puede hacer así:

$author->post()->save($post);

Cuando la relación está configurada correctamente, puede recuperar el modelo Post de esta manera:

$author->post

ManyToMany

Se utiliza una relación ManyToMany cuando ambos modelos pueden relacionarse con varios modelos del otro lado de la relación. Piense en varias etiquetas que puedan relacionarse con varias publicaciones, pero también al revés.

Para que esta relación funcione, debe haber una tabla dinámica adicional que contenga claves externas para ambas tablas de modelos. El nombre de esta tabla debe ser una combinación alfabética de las dos tablas relacionadas en plural. En este ejemplo, el nombre de la tabla sería post_tag y los campos de clave externa post_id y tag_id.

En el modelo Tag, la relación se define así:

public function posts()
{
return $this->belongsToMany(Post::class);
}

Mientras que en el modelo Post la relación se define así:

public function tags()
{
return $this->belongsToMany(Tag::class);
}

Puede asociar y desasociar los modelos entre sí de esta manera:

// On the post model
$post->tags()->attach($post);
$post->tags()->detach($post);
$post->tags()->sync([1,2,3]);
// On the tag model
$tag->posts()->attach($tag);
$tag->posts()->detach($tag);
$tag->posts()->sync([1,2,3]);

O puede sincronizar todos los modelos con relaciones, esto sobrescribirá todos los modelos relacionados en el modelo específico.

// On the post model
$post->tags()->sync([1,2,3]);
// On the tag model
$tag->posts()->sync([1,2,3]);

Los modelos con relaciones se pueden recuperar así:

$post->tags

Cuando llame al método de relación, obtendrá un objeto HasMany que también es un generador (de consultas).

// Collection of published Post models related to $tag.$tag->posts()->where('published', true)->get();

¡Espero que esto le anime!


Gracias por llegar hasta aquí, si encuentras esto útil no olvides aplaudir 👍🏼suscribirse para recibir más contenido.

Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre AWS y Laravel:

Recent Post