1
votes

Convertir SQL en Laravel

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();

et qu'il affiche ces données entrez la description de l'image ici

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.


2 commentaires

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


3 Réponses :


0
votes

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.'"));


3 commentaires

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



2
votes

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();


4 commentaires

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.



0
votes

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();


0 commentaires