Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción
Definición de relaciones
o Uno a uno
o Uno a muchos
o Uno a muchos (inverso)
o Muchos a muchos
o Definición de modelos personalizados de tablas intermedias
o Tiene uno a través
o Tiene muchos a través
Relaciones polimórficas
o Uno a uno
o Uno a muchos
o Muchos a muchos
o Tipos polimórficos personalizados
Relaciones dinámicas
Consultar relaciones
o Métodos de relación vs. Propiedades dinámicas
o Consultar la existencia de la relación
o Consulta de ausencia de relación
o Consultar relaciones polimórficas
o Contando modelos relacionados
o Contando modelos relacionados en relaciones polimórficas
Carga ansiosa
o Restricción de cargas impacientes
o Carga impaciente perezosa
Uno a uno
Uno a muchos
Muchos a muchos
Tiene uno a través
Tiene muchos a través
Uno a uno (polimórfico)
Uno a muchos (polimórfico)
Muchos a muchos (polimórfico)
Definición de relaciones
Las relaciones elocuentes se definen como métodos en sus clases modelo elocuentes. Dado que,
como los propios modelos de Eloquent, las relaciones también sirven como poderosos constructores
de consultas , definir las relaciones como métodos proporciona potentes capacidades de
encadenamiento de métodos y consultas. Por ejemplo, podemos encadenar restricciones adicionales
en esta postsrelación:
$user->posts()->where('active', 1)->get();
Pero, antes de sumergirnos demasiado en el uso de las relaciones, aprendamos a definir cada tipo.
Los nombres de las relaciones no pueden colisionar con los nombres de los atributos, ya que eso
podría hacer que su modelo no pueda saber cuál resolver.
Uno a uno
Una relación uno a uno es una relación muy básica. Por ejemplo, un Usermodelo puede estar
asociado con uno Phone. Para definir esta relación, colocamos un phonemétodo en
el Usermodelo. El phonemétodo debe llamar al hasOnemétodo y devolver su resultado:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
El primer argumento que se pasa al hasOnemétodo es el nombre del modelo relacionado. Una vez
que se define la relación, podemos recuperar el registro relacionado usando las propiedades
dinámicas de Eloquent. Las propiedades dinámicas le permiten acceder a métodos de relación como
si fueran propiedades definidas en el modelo:
$phone = User::find(1)->phone;
Eloquent determina la clave externa de la relación en función del nombre del modelo. En este
caso, Phonese asume automáticamente que el modelo tiene una user_idclave externa. Si desea
anular esta convención, puede pasar un segundo argumento al hasOnemétodo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* Get the user that owns the phone.
*/
public function user()
{
return $this->belongsTo('App\User', 'foreign_key');
}
Si su modelo principal no lo utiliza idcomo clave principal, o si desea unir el modelo secundario a
una columna diferente, puede pasar un tercer argumento al belongsTométodo que especifica la clave
personalizada de su tabla principal:
/**
* Get the user that owns the phone.
*/
public function user()
{
return $this->belongsTo('App\User', 'foreign_key', 'other_key');
}
Uno a muchos
Una relación de uno a muchos se utiliza para definir relaciones en las que un solo modelo posee
cualquier cantidad de otros modelos. Por ejemplo, una publicación de blog puede tener una cantidad
infinita de comentarios. Como todas las demás relaciones de Eloquent, las relaciones de uno a
muchos se definen colocando una función en su modelo de Eloquent:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
$comments = App\Post::find(1)->comments;
foreach ($comments as $comment) {
//
}
Dado que todas las relaciones también sirven como constructores de consultas, puede agregar más
restricciones a las que se recuperan los comentarios llamando al commentsmétodo y continuando
encadenando condiciones en la consulta:
Al igual que el hasOnemétodo, también puede anular las claves locales y externas pasando
argumentos adicionales al hasManymétodo:
Ahora que podemos acceder a todos los comentarios de una publicación, definamos una relación
para permitir que un comentario acceda a su publicación principal. Para definir la inversa de
una hasManyrelación, defina una función de relación en el modelo hijo que llama al belongsTométodo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
$comment = App\Comment::find(1);
echo $comment->post->title;
/**
* Get the post that owns the comment.
*/
public function post()
{
return $this->belongsTo('App\Post', 'foreign_key');
}
/**
* Get the post that owns the comment.
*/
public function post()
{
return $this->belongsTo('App\Post', 'foreign_key', 'other_key');
}
Muchos a muchos
Estructura de la tabla
users
id - integer
name - string
roles
id - integer
name - string
role_user
user_id - integer
role_id - integer
Estructura del modelo
Las relaciones de varios a varios se definen escribiendo un método que devuelve el resultado
del belongsToManymétodo. Por ejemplo, definamos el rolesmétodo en nuestro Usermodelo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
Una vez definida la relación, puede acceder a los roles del usuario utilizando la rolespropiedad
dinámica:
$user = App\User::find(1);
Como todos los demás tipos de relaciones, puede llamar al rolesmétodo para continuar
encadenando restricciones de consulta a la relación:
$roles = App\User::find(1)->roles()->orderBy('name')->get();
Además de personalizar el nombre de la tabla de unión, también puede personalizar los nombres de
columna de las claves en la tabla pasando argumentos adicionales al belongsToManymétodo. El
tercer argumento es el nombre de la clave externa del modelo en el que está definiendo la relación,
mientras que el cuarto argumento es el nombre de la clave externa del modelo al que se está
uniendo:
Para definir la inversa de una relación de varios a varios, realiza otra llamada a belongsToManyen su
modelo relacionado. Para continuar con nuestro ejemplo de roles de usuario, definamos
el usersmétodo en el Rolemodelo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
Como puede ver, la relación se define exactamente igual que su Usercontraparte, con la excepción
de hacer referencia al modelo. Dado que estamos reutilizando el método, todas las tablas habituales
y las opciones de personalización de claves están disponibles al definir la inversa de las relaciones
de muchos a muchos.App\UserbelongsToMany
Como ya ha aprendido, trabajar con relaciones de varios a varios requiere la presencia de una tabla
intermedia. Eloquent proporciona algunas formas muy útiles de interactuar con esta mesa. Por
ejemplo, supongamos que nuestro Userobjeto tiene muchos Roleobjetos con los que está
relacionado. Luego de acceder a esta relación, podemos acceder a la tabla intermedia usando
el pivotatributo en los modelos:
$user = App\User::find(1);
De forma predeterminada, solo las claves del modelo estarán presentes en el pivotobjeto. Si su
tabla dinámica contiene atributos adicionales, debe especificarlos al definir la relación:
return $this->belongsToMany('App\Role')->withTimestamps();
Como se señaló anteriormente, se puede acceder a los atributos de la tabla intermedia en los
modelos que utilizan el pivotatributo. Sin embargo, puede personalizar el nombre de este atributo
para reflejar mejor su propósito dentro de su aplicación.
Por ejemplo, si su aplicación contiene usuarios que pueden suscribirse a podcasts, probablemente
tenga una relación de varios a varios entre los usuarios y los podcasts. Si este es el caso, es posible
que desee cambiar el nombre de su descriptor de acceso a la tabla intermedia a
en subscriptionlugar de pivot. Esto se puede hacer usando el asmétodo al definir la relación:
return $this->belongsToMany('App\Podcast')
->as('subscription')
->withTimestamps();
Una vez hecho esto, puede acceder a los datos de la tabla intermedia usando el nombre
personalizado:
$users = User::with('podcasts')->get();
echo $podcast->subscription->created_at;
Si desea definir un modelo personalizado para representar la tabla intermedia de su relación, puede
llamar al usingmétodo al definir la relación. Los modelos dinámicos personalizados de muchos a
muchos deben extender la clase, mientras que los modelos dinámicos polimórficos personalizados
de muchos a muchos deben extender la clase. Por ejemplo, podemos definir un que usa un modelo
de
pivote personalizado :Illuminate\Database\Eloquent\Relations\PivotIlluminate\Database\Eloquent\Relati
ons\MorphPivotRoleRoleUser
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
<?php
namespace App;
use Illuminate\Database\Eloquent\Relations\Pivot;
//
}
Puede combinar usingy withPivotpara recuperar columnas de la tabla intermedia. Por ejemplo,
puede recuperar las columnas created_byy updated_byde la RoleUsertabla dinámica pasando los
nombres de las columnas al withPivotmétodo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
*/
return $this->belongsToMany('App\User')
->using('App\RoleUser')
->withPivot([
'created_by',
'updated_by',
]);
Nota: Es posible que los modelos pivote no utilicen el SoftDeletesrasgo. Si necesita eliminar
temporalmente los registros de pivote, considere convertir su modelo de pivote en un modelo de
Eloquent real.
Si ha definido una relación de muchos a muchos que usa un modelo de pivote personalizado, y ese
modelo de pivote tiene una clave principal que se incrementa automáticamente, debe asegurarse de
que su clase de modelo de pivote personalizado defina una incrementingpropiedad configurada
en true.
/**
* @var bool
*/
La relación "tiene uno a través" vincula los modelos a través de una única relación intermedia.
Por ejemplo, en una aplicación de taller de reparación de vehículos, cada uno Mechanicpuede tener
uno Cary cada uno Carpuede tener uno Owner. Si bien el Mechanicy el Ownerno tienen conexión
directa, el Mechanicpuede acceder a Owner través del Carmismo. Veamos las tablas necesarias para
definir esta relación:
mechanics
id - integer
name - string
cars
id - integer
model - string
mechanic_id - integer
owners
id - integer
name - string
car_id - integer
Ahora que hemos examinado la estructura de la tabla para la relación, definamos la relación en
el Mechanicmodelo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Mechanic extends Model
/**
*/
El primer argumento que se pasa al hasOneThroughmétodo es el nombre del modelo final al que
deseamos acceder, mientras que el segundo argumento es el nombre del modelo intermedio.
Se utilizarán las convenciones típicas de claves foráneas de Eloquent al realizar las consultas de la
relación. Si desea personalizar las claves de la relación, puede pasarlas como tercer y cuarto
argumento al hasOneThroughmétodo. El tercer argumento es el nombre de la clave externa en el
modelo intermedio. El cuarto argumento es el nombre de la clave externa en el modelo final. El
quinto argumento es la clave local, mientras que el sexto argumento es la clave local del modelo
intermedio:
/**
return $this->hasOneThrough(
'App\Owner',
'App\Car',
);
countries
id - integer
name - string
users
id - integer
country_id - integer
name - string
posts
id - integer
user_id - integer
title - string
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
/**
*/
El primer argumento que se pasa al hasManyThroughmétodo es el nombre del modelo final al que
deseamos acceder, mientras que el segundo argumento es el nombre del modelo intermedio.
Se utilizarán las convenciones típicas de claves foráneas de Eloquent al realizar las consultas de la
relación. Si desea personalizar las claves de la relación, puede pasarlas como tercer y cuarto
argumento al hasManyThroughmétodo. El tercer argumento es el nombre de la clave externa en el
modelo intermedio. El cuarto argumento es el nombre de la clave externa en el modelo final. El
quinto argumento es la clave local, mientras que el sexto argumento es la clave local del modelo
intermedio:
{
return $this->hasManyThrough(
'App\Post',
'App\User',
);
Relaciones polimórficas
Una relación polimórfica permite que el modelo de destino pertenezca a más de un tipo de modelo
utilizando una sola asociación.
Una relación polimórfica de uno a uno es similar a una relación simple de uno a uno; sin embargo, el
modelo de destino puede pertenecer a más de un tipo de modelo en una sola asociación. Por
ejemplo, un blog Posty un Userpueden compartir una relación polimórfica con un Imagemodelo. El
uso de una relación polimórfica uno a uno le permite tener una lista única de imágenes únicas que se
utilizan tanto para publicaciones de blog como para cuentas de usuario. Primero, examinemos la
estructura de la tabla:
posts
id - integer
name - string
users
id - integer
name - string
images
id - integer
url - string
imageable_id - integer
imageable_type - string
A continuación, examinemos las definiciones del modelo necesarias para construir esta relación:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
*/
return $this->morphTo();
/**
*/
/**
*/
Recuperando la relación
Una vez que la tabla y los modelos de su base de datos estén definidos, puede acceder a las
relaciones a través de sus modelos. Por ejemplo, para recuperar la imagen de una publicación,
podemos usar la imagepropiedad dinámica:
$post = App\Post::find(1);
$image = $post->image;
También puede recuperar el padre del modelo polimórfico accediendo al nombre del método que
realiza la llamada a morphTo. En nuestro caso, ese es el imageablemétodo
del Imagemodelo. Entonces, accederemos a ese método como una propiedad dinámica:
$image = App\Image::find(1);
$imageable = $image->imageable;
/**
*/
Una relación polimórfica de uno a muchos es similar a una relación simple de uno a muchos; sin
embargo, el modelo de destino puede pertenecer a más de un tipo de modelo en una sola
asociación. Por ejemplo, imagine que los usuarios de su aplicación pueden "comentar" tanto en
publicaciones como en videos. Usando relaciones polimórficas, puede usar una sola commentstabla
para ambos escenarios. Primero, examinemos la estructura de la tabla requerida para construir esta
relación:
posts
id - integer
title - string
body - text
videos
id - integer
title - string
url - string
comments
id - integer
body - text
commentable_id - integer
commentable_type - string
A continuación, examinemos las definiciones del modelo necesarias para construir esta relación:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
*/
return $this->morphTo();
/**
*/
/**
*/
Recuperando la relación
Una vez que la tabla y los modelos de su base de datos estén definidos, puede acceder a las
relaciones a través de sus modelos. Por ejemplo, para acceder a todos los comentarios de una
publicación, podemos usar la commentspropiedad dinámica:
$post = App\Post::find(1);
foreach ($post->comments as $comment) {
//
También puede recuperar el propietario de una relación polimórfica del modelo polimórfico
accediendo al nombre del método que realiza la llamada a morphTo. En nuestro caso, ese es
el commentablemétodo del Commentmodelo. Entonces, accederemos a ese método como una
propiedad dinámica:
$comment = App\Comment::find(1);
$commentable = $comment->commentable;
Las relaciones polimórficas de muchos a muchos son un poco más complicadas que
las relaciones morphOney morphMany. Por ejemplo, un blog Posty un Videomodelo podrían compartir
una relación polimórfica con un Tagmodelo. El uso de una relación polimórfica de muchos a muchos
le permite tener una sola lista de etiquetas únicas que se comparten entre publicaciones de blog y
videos. Primero, examinemos la estructura de la tabla:
posts
id - integer
name - string
videos
id - integer
name - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
/**
*/
A continuación, en el Tagmodelo, debe definir un método para cada uno de sus modelos
relacionados. Entonces, para este ejemplo, definiremos un postsmétodo y un videosmétodo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
*/
/**
*/
Recuperando la relación
Una vez que la tabla y los modelos de su base de datos estén definidos, puede acceder a las
relaciones a través de sus modelos. Por ejemplo, para acceder a todas las etiquetas de una
publicación, puede usar la tagspropiedad dinámica:
$post = App\Post::find(1);
//
También puede recuperar el propietario de una relación polimórfica del modelo polimórfico
accediendo al nombre del método que realiza la llamada a morphedByMany. En nuestro caso, esos
son los métodos postso videosen el Tagmodelo. Entonces, accederá a esos métodos como
propiedades dinámicas:
$tag = App\Tag::find(1);
//
use Illuminate\Database\Eloquent\Relations\Relation;
Relation::morphMap([
]);
use Illuminate\Database\Eloquent\Relations\Relation;
$alias = $post->getMorphClass();
$class = Relation::getMorphedModel($alias);
Relaciones dinámicas
use App\Order;
use App\Customer;
});
Al definir relaciones dinámicas, siempre proporcione argumentos de nombre clave explícitos para los
métodos de relación de Eloquent.
Consultar relaciones
Since all types of Eloquent relationships are defined via methods, you may call those methods to
obtain an instance of the relationship without actually executing the relationship queries. In addition,
all types of Eloquent relationships also serve as query builders, allowing you to continue to chain
constraints onto the relationship query before finally executing the SQL against your database.
For example, imagine a blog system in which a User model has many associated Post models:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
{
/**
*/
return $this->hasMany('App\Post');
You may query the posts relationship and add additional constraints to the relationship like so:
$user = App\User::find(1);
$user->posts()->where('active', 1)->get();
Como se demostró en el ejemplo anterior, puede agregar restricciones adicionales a las relaciones
cuando las consulte. Sin embargo, tenga cuidado al encadenar orWherecláusulas en una relación, ya
que las orWherecláusulas se agruparán lógicamente al mismo nivel que la restricción de la relación:
$user->posts()
->where('active', 1)
->orWhere('votes', '>=', 100)
->get();
use Illuminate\Database\Eloquent\Builder;
$user->posts()
return $query->where('active', 1)
})
->get();
$user = App\User::find(1);
//
Las propiedades dinámicas son de "carga diferida", lo que significa que solo cargarán sus datos de
relación cuando realmente acceda a ellas. Debido a esto, los desarrolladores a menudo usan
la carga ansiosa para precargar las relaciones que saben que se accederán después de cargar el
modelo. La carga ansiosa proporciona una reducción significativa en las consultas SQL que deben
ejecutarse para cargar las relaciones de un modelo.
Al acceder a los registros de un modelo, es posible que desee limitar sus resultados en función de la
existencia de una relación. Por ejemplo, imagine que desea recuperar todas las publicaciones de
blog que tengan al menos un comentario. Para hacerlo, puede pasar el nombre de la relación a
los métodos hasy orHas:
$posts = App\Post::has('comments')->get();
También puede especificar un operador y contar para personalizar aún más la consulta:
$posts = App\Post::has('comments.votes')->get();
use Illuminate\Database\Eloquent\Builder;
// Retrieve posts with at least one comment containing words like foo%...
})->get();
// Retrieve posts with at least ten comments containing words like foo%...
}, '>=', 10)->get();
Al acceder a los registros de un modelo, es posible que desee limitar sus resultados en función de la
ausencia de una relación. Por ejemplo, imagina que quieres recuperar todas las publicaciones de
blog que no tienen comentarios. Para hacerlo, puede pasar el nombre de la relación a
los métodos doesntHavey orDoesntHave:
$posts = App\Post::doesntHave('comments')->get();
use Illuminate\Database\Eloquent\Builder;
})->get();
Puede utilizar la notación de "puntos" para ejecutar una consulta en una relación anidada. Por
ejemplo, la siguiente consulta recuperará todas las publicaciones que no tienen comentarios y las
publicaciones que tienen comentarios de autores que no están prohibidos:
use Illuminate\Database\Eloquent\Builder;
$query->where('banned', 0);
})->get();
use Illuminate\Database\Eloquent\Builder;
$comments = App\Comment::whereHasMorph(
'commentable',
['App\Post', 'App\Video'],
)->get();
$comments = App\Comment::whereDoesntHaveMorph(
'commentable',
'App\Post',
)->get();
Puede usar el $typeparámetro para agregar diferentes restricciones según el modelo relacionado:
use Illuminate\Database\Eloquent\Builder;
$comments = App\Comment::whereHasMorph(
'commentable',
['App\Post', 'App\Video'],
)->get();
En lugar de pasar una serie de posibles modelos polimórficos, puede proporcionar *como comodín y
dejar que Laravel recupere todos los posibles tipos polimórficos de la base de datos. Laravel
ejecutará una consulta adicional para realizar esta operación:
use Illuminate\Database\Eloquent\Builder;
Si desea contar el número de resultados de una relación sin cargarlos realmente, puede usar
el withCountmétodo, que colocará una columna en sus modelos resultantes. Por ejemplo:
{relation}_count
$posts = App\Post::withCount('comments')->get();
echo $post->comments_count;
Puede agregar los "recuentos" para varias relaciones, así como agregar restricciones a las
consultas:
use Illuminate\Database\Eloquent\Builder;
}])->get();
echo $posts[0]->votes_count;
echo $posts[0]->comments_count;
También puede aplicar un alias al resultado del recuento de relaciones, lo que permite varios
recuentos en la misma relación:
use Illuminate\Database\Eloquent\Builder;
$posts = App\Post::withCount([
'comments',
$query->where('approved', false);
},
])->get();
echo $posts[0]->comments_count;
echo $posts[0]->pending_comments_count;
echo $posts[0]->title;
echo $posts[0]->body;
echo $posts[0]->comments_count;
Además, con el loadCountmétodo, puede cargar un recuento de relaciones después de que el
modelo principal ya se haya recuperado:
$book = App\Book::first();
$book->loadCount('genres');
$query->where('rating', 5);
}])
Si desea cargar ansiosamente una morphTorelación, así como los recuentos de relaciones anidadas
en las diversas entidades que pueden ser devueltas por esa relación, puede usar el withmétodo en
combinación con el método de la morphTorelación morphWithCount.
use Illuminate\Database\Eloquent\Relations\MorphTo;
$activities = ActivityFeed::query()
$morphTo->morphWithCount([
]);
}])->get();
Además, puede usar el loadMorphCountmétodo para cargar ansiosamente todos los recuentos de
relaciones anidadas en las diversas entidades de la relación polimórfica si los ActivityFeedmodelos
ya se han recuperado:
$activities = ActivityFeed::with('parentable')
->get()
->loadMorphCount('parentable', [
]);
Carga ansiosa
Al acceder a las relaciones de Eloquent como propiedades, los datos de la relación se "cargan de
forma diferida". Esto significa que los datos de la relación no se cargan realmente hasta que accede
por primera vez a la propiedad. Sin embargo, Eloquent puede "cargar ansiosamente" las relaciones
en el momento en que consulta el modelo principal. La carga ansiosa alivia el problema de las
consultas N + 1. Para ilustrar el problema de la consulta N + 1, considere un Bookmodelo relacionado
con Author:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
*/
return $this->belongsTo('App\Author');
$books = App\Book::all();
Este ciclo ejecutará 1 consulta para recuperar todos los libros de la mesa, luego otra consulta para
cada libro para recuperar el autor. Entonces, si tenemos 25 libros, este ciclo ejecutaría 26 consultas:
1 para el libro original y 25 consultas adicionales para recuperar el autor de cada libro.
Thankfully, we can use eager loading to reduce this operation to just 2 queries. When querying, you
may specify which relationships should be eager loaded using the with method:
$books = App\Book::with('author')->get();
echo $book->author->name;
Sometimes you may need to eager load several different relationships in a single operation. To do so,
just pass additional arguments to the with method:
$books = App\Book::with('author.contacts')->get();
Si desea cargar ansiosamente una morphTorelación, así como relaciones anidadas en las diversas
entidades que pueden ser devueltas por esa relación, puede usar el withmétodo en combinación con
el método de la morphTorelación morphWith. Para ayudar a ilustrar este método, consideremos el
siguiente modelo:
<?php
use Illuminate\Database\Eloquent\Model;
/**
*/
return $this->morphTo();
}
En este ejemplo, vamos a suponer Event, Photoy Postmodelos pueden
crear ActivityFeedmodelos. Además, supongamos que los Eventmodelos pertenecen a
un Calendarmodelo, los Photomodelos están asociados con Tagmodelos y los Postmodelos
pertenecen a un Authormodelo.
use Illuminate\Database\Eloquent\Relations\MorphTo;
$activities = ActivityFeed::query()
$morphTo->morphWith([
]);
}])->get();
Es posible que no siempre necesite todas las columnas de las relaciones que está recuperando. Por
esta razón, Eloquent te permite especificar qué columnas de la relación te gustaría recuperar:
$books = App\Book::with('author:id,name')->get();
Al usar esta función, siempre debe incluir la idcolumna y cualquier columna de clave externa
relevante en la lista de columnas que desea recuperar.
Carga ansiosa por defecto
A veces, es posible que desee cargar siempre algunas relaciones al recuperar un modelo. Para
lograr esto, puede definir una $withpropiedad en el modelo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var array
*/
/**
* Get the author that wrote the book.
*/
return $this->belongsTo('App\Author');
Si desea eliminar un elemento de la $withpropiedad para una sola consulta, puede usar
el withoutmétodo:
$books = App\Book::without('author')->get();
A veces es posible que desee cargar una relación, pero también especificar condiciones de consulta
adicionales para la consulta de carga ansiosa. He aquí un ejemplo:
}])->get();
En este ejemplo, Eloquent solo cargará con entusiasmo publicaciones donde la titlecolumna de la
publicación contenga la palabra first. Puede llamar a otros métodos de creación de consultas para
personalizar aún más la operación de carga ansiosa:
$query->orderBy('created_at', 'desc');
}])->get();
A veces, es posible que deba cargar una relación con entusiasmo después de que el modelo
principal ya se haya recuperado. Por ejemplo, esto puede ser útil si necesita decidir dinámicamente
si cargar modelos relacionados:
$books = App\Book::all();
if ($someCondition) {
$books->load('author', 'publisher');
$query->orderBy('published_date', 'asc');
}]);
Para cargar una relación solo cuando aún no se ha cargado, use el loadMissingmétodo:
{
$book->loadMissing('author');
return [
];
Si desea cargar ansiosamente una morphTorelación, así como relaciones anidadas en las diversas
entidades que pueden ser devueltas por esa relación, puede usar el loadMorphmétodo.
Este método acepta el nombre de la morphTorelación como su primer argumento y una matriz de
pares modelo / relación como su segundo argumento. Para ayudar a ilustrar este método,
consideremos el siguiente modelo:
<?php
use Illuminate\Database\Eloquent\Model;
/**
return $this->morphTo();
$activities = ActivityFeed::with('parentable')
->get()
->loadMorph('parentable', [
]);
$post = App\Post::find(1);
$post->comments()->save($comment);
$post = App\Post::find(1);
$post->comments()->saveMany([
]);
$post->comments()->save($comment);
$post->refresh();
$post->comments;
$post = App\Post::find(1);
$post->comments[0]->message = 'Message';
$post->push();
El método Create
$post = App\Post::find(1);
$comment = $post->comments()->create([
]);
$post = App\Post::find(1);
$post->comments()->createMany([
],
],
]);
$account = App\Account::find(10);
$user->account()->associate($account);
$user->save();
$user->account()->dissociate();
$user->save();
Modelos predeterminados
/**
*/
return $this->belongsTo('App\User')->withDefault();
Para completar el modelo predeterminado con atributos, puede pasar una matriz o un cierre
al withDefaultmétodo:
/**
*/
return $this->belongsTo('App\User')->withDefault([
]);
/**
*/
});
Eloquent también proporciona algunos métodos auxiliares adicionales para hacer que trabajar con
modelos relacionados sea más conveniente. Por ejemplo, imaginemos que un usuario puede tener
muchos roles y un rol puede tener muchos usuarios. Para adjuntar un rol a un usuario insertando un
registro en la tabla intermedia que une los modelos, use el attachmétodo:
$user = App\User::find(1);
$user->roles()->attach($roleId);
Al adjuntar una relación a un modelo, también puede pasar una matriz de datos adicionales para
insertarlos en la tabla intermedia:
A veces, puede ser necesario eliminar un rol de un usuario. Para eliminar un registro de relación de
varios a varios, utilice el detachmétodo. El detachmétodo eliminará el registro apropiado de la tabla
intermedia; sin embargo, ambos modelos permanecerán en la base de datos:
$user->roles()->detach($roleId);
$user = App\User::find(1);
$user->roles()->detach([1, 2, 3]);
$user->roles()->attach([
]);
Asociaciones de sincronización
$user->roles()->sync([1, 2, 3]);
También puede pasar valores de tabla intermedios adicionales con los ID:
$user->roles()->syncWithoutDetaching([1, 2, 3]);
Asociaciones de alternancia
La relación de muchos a muchos también proporciona un togglemétodo que "alterna" el estado de
adjunto de los ID dados. Si la identificación proporcionada está actualmente adjunta, se
desvinculará. Asimismo, si actualmente se encuentra desvinculado, se adjuntará:
$user->roles()->toggle([1, 2, 3]);
Cuando se trabaja con una relación de muchos a muchos, el savemétodo acepta una matriz de
atributos de tabla intermedia adicionales como segundo argumento:
$user = App\User::find(1);
$user->roles()->updateExistingPivot($roleId, $attributes);
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var array
*/
/**
*/
return $this->belongsTo('App\Post');
}
Ahora, cuando actualice a Comment, la propiedad Posttambién tendrá su updated_atcolumna
actualizada, lo que hace que sea más conveniente saber cuándo invalidar un caché del Postmodelo:
$comment = App\Comment::find(1);
$comment->save();