2017-09-21 9 views
0

J'ai quatre modèles: OwnerCompany, Owner, User, et Role.Laravel 5.1 contraindre et impatient de charger plusieurs relations imbriquées

Je veux obtenir tous OwnerCompanys désireux de charger leur propriétaire et aussi le chargement désireux ses Les utilisateurs qui ont le rôle avec le nom « admin ».

OwnerCompany::with('owner.users')->whereHas('owner.users.roles', function ($query) { 
    $query->where('name', 'admin'); 
})->get(); 

Ceci charge dans les modèles mais ne contraint pas les utilisateurs, ils sont tous chargés.

+0

'OwnerCompany-> Propriétaire-> Utilisateur-> Role' est que votre relation de table –

+0

OwnerCompany est un tableau croisé dynamique entre les propriétaires et les entreprises, un utilisateur a une relation polymorphe avec le propriétaire ou d'autres modèles, et les utilisateurs sont aussi liés à Rôles à travers un tableau croisé dynamique. – Mike

Répondre

0

Non testé. Je pense que tu manques comme ou comme opérateur.

OwnerCompany::with('owner.users')->whereHas('owner.users.roles', function ($query) { 
    $query->where('name','like','admin'); 
})->get(); 
+0

Merci mais 'j'aime' ou '=' est inutile comme si elle est omise, cela sous-entend que c'est '='. – Mike

0

Je l'essaie, si le travail m'en a alors fait part. non testé

1).

OwnerCompany::with('owner.users.roles')->whereHas('owner', function ($query) { 
    $query->whereHas('users', function($qr){ 
     $qr->whereHas('roles', function($q){ 
      $q->where('name', 'admin'); 
     }); 
    }); 
})->get(); 

OU

2).

OwnerCompany::with('owner.users.roles')->whereHas('owner.users.roles', function ($query) { 
    $query->where('name', 'admin'); 
})->get(); 
+0

Merci pour votre aide, mais votre deuxième exemple est le même que ce que j'ai écrit dans la question (je n'ai pas besoin de charger dans le modèle). En ce qui concerne votre premier, je dois seulement récupérer les utilisateurs avec le rôle 'admin'. Quand je cartographie les utilisateurs, je les vois tous. – Mike

+0

vérifiez-vous 'name = admin' dans la table des rôles ou quelle table –

+0

Dans la table des rôles. – Mike

0

Si je me trompe pas, vous voulez que chaque objet OwnerCompany pour contenir l'objet Owner, qui contiendra « admins ». Je ferais quelque chose comme ça.

$ownerCompany = OwnerCompany::all(); 

return $ownerCompany->each(function ($company) { 
    $company->owner; 
    $company->owner->users->each(function ($user) { 
     return $user->hasRole('admin'); 
    }); 
}); 

et à l'intérieur User classe:

public function role() 
{ 
    return $this->belongsTo(Role::class); 
} 

public function hasRole($role) 
{ 
    if ($this->role()->where('name', $role)->first()) { 
     return $this; 
    } 
    return null; 
} 

Malheureusement, je ne peux pas tester en ce moment, donc si vous avez des problèmes me le faire savoir.