He encontrado que el concepto y el significado detrás de estos métodos son un poco confusos, ¿es posible que alguien me explique cuál es la diferencia entre has
y with
en el contexto de un ejemplo (si es posible)?
fuente
He encontrado que el concepto y el significado detrás de estos métodos son un poco confusos, ¿es posible que alguien me explique cuál es la diferencia entre has
y with
en el contexto de un ejemplo (si es posible)?
with()
es para cargar con ganas . Eso básicamente significa que, a lo largo del modelo principal, Laravel precargará las relaciones que especifique. Esto es especialmente útil si tiene una colección de modelos y desea cargar una relación para todos ellos. Porque con la carga ansiosa, ejecuta solo una consulta de base de datos adicional en lugar de una para cada modelo de la colección.
Ejemplo:
User > hasMany > Post
$users = User::with('posts')->get();
foreach($users as $user){
$users->posts; // posts is already loaded and no additional DB query is run
}
has()
es filtrar el modelo de selección en función de una relación. Por lo tanto, actúa de manera muy similar a una condición normal de WHERE. Si solo usa has('relation')
eso significa que solo quiere obtener los modelos que tienen al menos un modelo relacionado en esta relación.
Ejemplo:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
whereHas()
funciona básicamente igual has()
pero le permite especificar filtros adicionales para que el modelo relacionado los verifique.
Ejemplo:
User > hasMany > Post
$users = User::whereHas('posts', function($q){
$q->where('created_at', '>=', '2015-01-01 00:00:00');
})->get();
// only users that have posts from 2015 on forward are returned
with('relation')
incluirá los datos de la tabla relacionada en la colección devuelta,has('relation')
ywhereHas('relation')
será no incluir datos de la tabla relacionada. Por lo tanto, es posible que tenga que llamar a amboswith('relation')
, así como ahas()
owhereHas()
.whereHas
en la relación del usuario al consultar la publicación.whereHas
se usa usa eluse Illuminate\Database\Eloquent\Builder;
que luego está confunction(Builder $query)
. La mayoría de los ejemplos que he visto, utilizan puntosBuilder
, simplemente pasan la consulta $, ¿cuál es la forma correcta?El documento ya ha explicado el uso. Entonces estoy usando SQL para explicar estos métodos
Ejemplo:
Asumiendo que hay un
Order (orders)
tiene muchosOrderItem (order_items)
.Y ya has construido la relación entre ellos.
Estos tres métodos se basan en una relación .
Con
Resultado:
with()
devuelve el objeto modelo y sus resultados relacionados.Ventaja: es una carga ansiosa que puede evitar el problema de N + 1 .
Cuando está utilizando el siguiente Eloquent Builder:
Laravel cambia este código a solo dos SQL :
Y luego laravel fusiona los resultados del segundo SQL como diferentes de los resultados del primer SQL por clave externa . Por fin devolver los resultados de la colección.
Entonces, si seleccionó columnas sin la tecla Foreign_key en cierre, el resultado de la relación estará vacío:
Tiene
Has
devolverá el objeto del modelo de que su relación no está vacía .Laravel cambia este código a un SQL :
donde tiene
whereHas
yorWhereHas
métodos para ponerwhere
condiciones a sushas
consultas. Estos métodos le permiten agregar restricciones personalizadas a una restricción de relación .Laravel cambia este código a un SQL :
fuente