J'ai trouvé le concept et la signification derrière ces méthodes un peu déroutants, est-il possible pour quelqu'un de m'expliquer quelle est la différence entre has
et with
est, dans le contexte d'un exemple (si possible)?
la source
J'ai trouvé le concept et la signification derrière ces méthodes un peu déroutants, est-il possible pour quelqu'un de m'expliquer quelle est la différence entre has
et with
est, dans le contexte d'un exemple (si possible)?
with()
est pour un chargement rapide . Cela signifie essentiellement que, le long du modèle principal, Laravel préchargera la ou les relations que vous spécifiez. Cela est particulièrement utile si vous avez une collection de modèles et que vous souhaitez charger une relation pour chacun d'eux. Parce qu'avec un chargement rapide, vous n'exécutez qu'une seule requête DB supplémentaire au lieu d'une pour chaque modèle de la collection.
Exemple:
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()
consiste à filtrer le modèle de sélection en fonction d'une relation. Il agit donc de manière très similaire à une condition WHERE normale. Si vous utilisez uniquement has('relation')
cela signifie que vous souhaitez uniquement obtenir les modèles qui ont au moins un modèle lié dans cette relation.
Exemple:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
whereHas()
fonctionne de la même manière que has()
mais vous permet de spécifier des filtres supplémentaires pour le modèle associé à vérifier.
Exemple:
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')
inclura les données de la table connexe dans la collection retournée,has('relation')
etwhereHas('relation')
ne pas inclure les données de la table correspondante. Vous devrez donc peut-être appeler à la foiswith('relation')
ainsi quehas()
ouwhereHas()
.whereHas
sur la relation utilisateur lors de la requête post.whereHas
utiliseuse Illuminate\Database\Eloquent\Builder;
ce qui est alors avecfunction(Builder $query)
. La plupart des exemples que j'ai vus, utilisent leBuilder
, passez simplement la requête $, quelle est la bonne façon?Le document a déjà expliqué l'utilisation. J'utilise donc SQL pour expliquer ces méthodes
Exemple:
En supposant qu'il y en
Order (orders)
a plusieursOrderItem (order_items)
.Et vous avez déjà construit la relation entre eux.
Ces trois méthodes sont toutes basées sur une relation .
Avec
Résultat:
with()
retourne l'objet modèle et ses résultats associés.Avantage: c'est un chargement rapide qui peut éviter le problème N + 1 .
Lorsque vous utilisez Eloquent Builder suivant:
Laravel change ce code en seulement deux SQL :
Et puis laravel fusionne les résultats du deuxième SQL comme différents des résultats du premier SQL par clé étrangère . Enfin, retournez les résultats de la collecte.
Donc, si vous avez sélectionné des colonnes sans la clé étrangère en fermeture, le résultat de la relation sera vide:
A
Has
retournera l'objet du modèle que sa relation n'est pas vide .Laravel change ce code en un SQL :
Où est
whereHas
et lesorWhereHas
méthodes pour mettre deswhere
conditions à voshas
requêtes. Ces méthodes vous permettent d'ajouter des contraintes personnalisées à une contrainte de relation .Laravel change ce code en un SQL :
la source