2017-10-12 1 views
1

Je veux obtenir tous les utilisateurs qui ont une ligne liée dans le tableau addresses ou dans le tableau institutes. En outre, je veux que modeIN devrait être égale à MT. Je pensais que la requête suivante ferait cela, mais il ne fonctionne pas:Laravel: orWhereHas() désactive où()?

$users = User::whereHas('addresses') 
      ->orWhereHas('institutes') 
      ->where('modeIN', '=', 'MT') 
      ->get() 
      ->pluck('modeIN'); 

dd($users); 

Il y a encore les utilisateurs répertoriés où modeIN ne correspond pas à MT. Pourquoi cela se passe-t-il et comment puis-je le réparer?

enter image description here

+0

Regardez la requête qui est effectivement généré, et AND et OR combinaisons que vous êtes en train de construire .... Je pense que vous trouverez qu'il est 'A ADRESSES OU (HAS INSTITUTS ET Modin = ' MT) ', plutôt que le' (A ADDRESSES OU A INSTITUTES) ET MODEIN = 'MT'' que vous attendiez –

+0

@MarkBaker puisque je n'ai pas défini d'accolades il me semble comme 'A ADRESSES OU A INSTITUTES et modeIN = 'MT'. Quelle est la logique par défaut comment Laravel lit ceci? – Adam

+0

L'utilisation d'un OU est de définir les accolades pour vous ..... regardez le SQL qui est généré pour exécuter la requête si vous ne me croyez pas –

Répondre

2

Je ne peux pas vérifier ce moment, mais fait quelque chose comme ça résoudre ce problème?

$users = User::where('modeIN', 'MT') 
    ->where(function ($query) { 
     $query->has('addresses') 
       ->orHas('institutes'); 
     }) 
    ->pluck('modeIN');