web-dev-qa-db-fra.com

Laravel - Eloquent "Has", "With", "WhereHas" - Que signifient-ils?

J'ai trouvé le concept et la signification de ces méthodes un peu déroutants. Est-il possible que quelqu'un m'explique quelle est la différence entre has et with, dans le contexte d'un exemple ( si possible)?

171
user4898812

Avec

with() est pour chargement rapide. Cela signifie fondamentalement que, selon le modèle principal, Laravel préchargera les relations que vous spécifiez. Ceci est particulièrement utile si vous avez une collection de modèles et que vous souhaitez charger une relation pour chacun d'eux. Avec un chargement rapide, vous n'exécutez qu'une seule requête de base de données 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
}

A

has() consiste à filtrer le modèle de sélection en fonction d'une relation. Ainsi, il agit de manière très similaire à une condition WHERE normale. Si vous utilisez simplement has('relation'), cela signifie que vous souhaitez uniquement obtenir les modèles qui ont au moins un modèle associé 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

Où est

whereHas() fonctionne fondamentalement 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
455
lukasgeiter