Disons que j'ai ceci:
$drivers = Driver::whereRaw('driver_number not in (select driver_number from buses) AND station_id = ? ', [$station_id].' OR id = ?', [$bus->Driver_id]) ->get();
Ensuite, je veux obtenir ces données sous forme de requête laravel et voici ce que j'ai fait:
SELECT * FROM drivers where driver_number NOT IN (SELECT driver_number FROM buses) AND station_id = 2 OR driver_number = 'Dr_02'
Mais j'obtiens cette erreur:
SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064 Vous avez un erreur dans votre syntaxe SQL; consultez le manuel correspondant à votre Version du serveur MariaDB pour la bonne syntaxe à utiliser près de 'numéro_pilote pas dans (sélectionnez driver_number parmi les bus) AND station_id =? ' à la ligne 1 (SQL: sélectionnez * parmi
pilotes
où id = 2 numéro_pilote pas dans (sélectionnez driver_number parmi les bus) AND station_id =?)
Je pense qu'il y a une erreur de la façon dont on le dit, c'est qu'il obtient une erreur système de type. Donc, si quelqu'un connaît une meilleure façon de le faire, vous pouvez aider.
3 Réponses :
Vous pouvez essayer d'utiliser
$task_without_due_date = \DB::select(\DB::raw("SELECT * FROM drivers where driver_number NOT IN (SELECT driver_number FROM buses) AND station_id = '.$station_id.' OR driver_number = '.$bus->Driver_id.'"));
quand je le lance comme ça, il ne retrunera rien d'autre que []
. mais quand je supprime AND station_id = '. $ station_id.'
cela fonctionnera mais il renverra des données que je ne veux pas.
Ajouter OU et vérifier bcoz Je n'ai pas de code exact alors comment je peux comprendre
Vous pouvez déboguer votre requête DB :: enableQueryLog (); // Activer le journal des requêtes // Votre requête éloquente dd (DB :: getQueryLog ()); // Afficher les résultats du journal
C'est difficile à gérer dans Laravel. La logique de votre clause WHERE
est essentiellement (A et B) ou C
, où la condition A
peut être représentée par un NOT EXISTS
sous-requête dans MySQL.
$drivers = DB::table('Driver d') ->where(function($query1) { return $query1 ->whereNotExists(function ($query2) { $query2->select(DB::raw(1)) ->from('buses b') ->whereRaw('d.driver_number = b.driver_number'); }) ->where('station_id', '=', '2'); }) ->orWhere('driver_number', '=', 'Dr_02'); ->get();
merci pour votre relecture, mais votre réponse montre cette compact (): Variable non définie: opérateur
@Lafoune Quelle version de Laravel utilisez-vous?
laravel 5.5, est le problème avec la version que j'utilise?
Je ne peux pas tester mon code pour le moment. Ma réponse et l'exécution de la requête entière en tant que requête brute sont les deux seules possibilités que je peux voir.
Essayez ceci,
$result = DB::table('drivers') ->whereNotIn('driver_number', function($q){ $q->select('driver_number')->from('buses'); }) ->where('station_id', '=', 2) ->where('driver_number', '=', 'Dr_02') ->get();
Veuillez ajouter des parenthèses à votre clause
WHERE
pour la rendre sans ambiguïté.vous pouvez essayer $ task_without_due_date = \ DB :: select (\ DB :: raw ("votre requête)); ceci aussi