4
votes

Comment utiliser l'opérateur AND dans Laravel Query?

Sélectionnez un utilisateur

@foreach ($Query as $selectedUser)

    Code formatting<p> {{ $selectedUser->username}}</p>  

@endforeach  

Donc, en anglais, recherchez un nom d'utilisateur où id n'est pas égal à l'ID utilisateur actuellement connecté et où la colonne valeur1 de l'utilisateur authentifié est égale à la valeur1 ou à la valeur2 d'un autre utilisateur ou value 3column

Voici une déclaration, j'ai fait ce qui ne fonctionne pas correctement mais cela fonctionne sans l'opérateur OR

$Query = DB::table('users')
    ->select('username')
    ->where('id', '!=', Auth::user()->id)
    ->whereIn(Auth::user()->recommendationWord1 , '=', 'value1', '||' , 'value2', '||' , 'value3'
    ->get();

cette déclaration est une exemple du format et contient ce que j'ai essayé.

where(Auth::user()->recommendationWord1, '=' , 'value1') 

Voici le code de ma page HTML et comment je la poste

where id =! Auth::user->id 

// this prevents the query returning the current user logged in 

where Auth::user->value1 ,'=', 'value1'  ||   'value2' || 'value3' 


5 commentaires

Vérifiez ici .


recommendationWord1 est-il le nom de la colonne?


@Tpojka oui c'est une colonne avec la table Users


Ensuite, ce que @Davit vous a laissé avec le changement: 'recommendationWord1' au lieu de Auth :: user () -> recommendationWord1 . Le premier argument de la méthode whereIn ($ nom_colonne, $ tableau) est le nom de la colonne par rapport à laquelle vous voulez vérifier les valeurs du tableau. Consultez les documents.


ok, aussi $ array qui contient les noms de colonnes, vérifiant simplement que vous le savez, je ne fais que comparer les colonnes et trouver celles qui sont identiques


3 Réponses :


2
votes

où dans la structure est -> whereIn ('attribut', ['val1', 'val2', ...]) Dans votre cas

DB::table('users')
    ->select('username')
    ->where('id', '!=', Auth::user()->id)
    ->whereIn(Auth::user()->recommendationWord1 , ['value1', 'value2', 'value3'])
    ->get();


3 commentaires

Voici le message d'erreur, Colonne introuvable: 1054 Colonne inconnue 'test1' dans 'clause where' (SQL: sélectionnez username parmi utilisateurs id ! = 7 et test1 dans (valeur1, valeur2, valeur3)). Auth :: user () -> recommendationWord1 renvoie test1 qui est correct car c'est ce qui est stocké dans ce champ


Il semble ne pas être retourné ou obtenir les valeurs du champ value1, value2 et value3


L'argument @John doit être le nom de la colonne et non la valeur. C'est à dire. 'recommendationWord1' au lieu de Auth :: user () -> recommendationWord1 .



2
votes

Avez-vous essayé le paramètre de regroupement?

select * from users where name = 'John' and (votes > 100 or title = 'Admin')

Consultez l'exemple de la documentation:

Parfois, vous devrez peut-être créer des clauses where plus avancées telles que Clauses "where exists" ou regroupements de paramètres imbriqués. Le générateur de requêtes Laravel peut également les gérer. Pour commencer, examinons un exemple de contraintes de regroupement entre parenthèses:

DB::table('users')
            ->where('name', '=', 'John')
            ->where(function ($query) {
                $query->where('votes', '>', 100)
                      ->orWhere('title', '=', 'Admin');
            })
            ->get();
enter code here

Comme vous pouvez le voir, passer une fermeture dans la méthode where indique le générateur de requêtes pour commencer un groupe de contraintes. La fermeture recevra une instance de générateur de requête que vous pouvez utiliser pour définir les contraintes qui doivent être contenues dans le groupe de parenthèses. L'exemple ci-dessus produira le SQL suivant:

$Query = DB::table('users')
        ->select('username')
        ->where('id', '!=', Auth::user()->id)
        ->where(function($query){
              $query->where(Auth::user()->recommendationWord1, '=', 'value1')
              ->orWhere(Auth::user()->recommendationWord1, '=', 'value2')
              ->orWhere(Auth::user()->recommendationWord1, '=', 'value3');
              })
         ->get();

https://laravel.com/docs/5.7/queries#where-clauses


5 commentaires

oui ça a l'air très bien, ça a l'air très soigné. Cependant, la principale chose que je recherche est essentiellement au lieu de faire Auth :: user () -> recommendationWord1 = word1, word2, word3, et ainsi de suite à plusieurs reprises


Si vous regardez la réponse @Davit ci-dessous, cela le montre clairement mais ne fonctionne pas correctement


laissez-moi savoir si cela a fonctionné. Je ne sais pas si vous l'avez vu, j'ai modifié ma réponse avec votre requête solution possible


oui cette solution fonctionne mais je voudrais qu'elle soit raccourcie, c'est mon problème maintenant. donc comme 1 ouWhere instruction serait génial mais ne répétant pas Auth :: user part


Je ne sais pas si cela peut être réalisé ... au moins je ne le sais pas ... et si vous avez essayé de combiner ma solution avec la solution de @Davit? en utilisant whereIn au lieu de orWhere



2
votes

Essayez ceci:

$users = User
            ::where('id', '<>', auth()->id())
            ->whereIn(auth()->user()->recommendationWord1, ['value1', 'value2', 'value3']) 
            ->get()


5 commentaires

"whereIn" array: 3 [▼ 0 => "test1" 1 => "=" 2 => array: 3 [▼ 0 => "word1" 1 => "word2" 2 => "word3"]]


C'est la sortie de cette déclaration, semble ne pas obtenir word1 ou dans l'exemple que j'ai donné value1 etc.


Comment est-ce une sortie de ces phrases? qu'avez-vous dd () pour obtenir ce résultat?


Non désolé, je voulais dire que c'était dans la sortie de la console de message d'erreur, mon mauvais.


Je posterai dans ma réponse comment je la sortirai