IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Laravel PHP Discussion :

query NOT IN Laravel


Sujet :

Laravel PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2015
    Messages : 22
    Points : 16
    Points
    16
    Par défaut query NOT IN Laravel
    Bonjour à tous,

    J'aimerais faire une requête sql mais je ne parvient pas à trouver la syntaxe
    Si quelqu'un pouvait me donner un coup de main ca serait chouette

    voici la requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Terminaux.*
    FROM Terminaux
    WHERE Terminaux.IdTerminal NOT IN (
                    SELECT Terminaux.IdTerminal
                    FROM Terminaux INNER JOIN ReservationsDetails ON Terminaux.IdTerminal=ReservationsDetails.TerminalId
                    INNER JOIN Reservations ON ReservationsDetails.IdReservation = Reservations.IdReservation
                    WHERE Etat !=4)

    j'ai essayé ceci sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $Terminaux = DB::table('Terminaux')
                ->whereNotIn('Terminaux.IdTerminal',function($query){
                    $query->select('Terminaux.IdTerminal')
                          ->from('Terminaux')
                          ->innerjoin('ReservationsDetails','Terminaux.IdTerminal','=','ReservationsDetails.TerminalId')
                          ->innerjoin('Reservations','ReservationsDetails.IdReservation','=','Reservations.IdReservation')
                          ->where('Etat','!=',4);
     
                })->get();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $Terminaux = DB::table('Terminaux')
                ->whereNotIn('IdTerminal',[DB::raw("(SELECT Terminaux.IdTerminal
                    FROM Terminaux inner join ReservationsDetails on Terminaux.IdTerminal=ReservationsDetails.TerminalId
                    inner join Reservations on ReservationsDetails.IdReservation = Reservations.IdReservation
                    where Etat !=4)")])
                ->get();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     $Terminaux=Terminaux::select('*')
                ->whereNotIn('IdTerminal',[DB::raw("(SELECT Terminaux.IdTerminal
                    FROM Terminaux inner join ReservationsDetails on Terminaux.IdTerminal=ReservationsDetails.TerminalId
                    inner join Reservations on ReservationsDetails.IdReservation = Reservations.IdReservation
                    where Etat !=4)")])
                ->get();
     
            dd($Terminaux);
    Merci d'avance !

  2. #2
    Membre actif
    Avatar de Micmaya
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 131
    Points : 202
    Points
    202
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Je pense que le WhereNotIn (ou WhereIn) s'attend à avoir un tableau en deuxième paramètre et qu'il ne reçoit pas !

    Dans la deuxième requête j'essayerai de terminer la requête avec la méthode "pluck" qui retourne un tableau (ce que ne fait plus la méthode "lists", qui retourne maintenant une collection).

    Sinon, affiche nous déjà la requête qu'il génère pour voir d'où vient le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DB::enableQueryLog();
    dd(DB::getQueryLog());
    Bien à toi,
    Pensez à mettre comme si c'est le cas !

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Dans ce genre de cas, quand l'ORM devient plus une plaie qu'une aide, il me semble que retourner aux fondamentaux est une bonne idée.
    Surtout quand le framework, l'as prévu dans son core.
    Perso j'entrevois deux solutions.

    Une où je maitrise le process :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public static function terminal(){
     
           $sql = "
           SELECT Terminaux.*
                FROM Terminaux
                WHERE Terminaux.IdTerminal NOT IN (
                                SELECT Terminaux.IdTerminal
                                FROM Terminaux INNER JOIN ReservationsDetails ON Terminaux.IdTerminal=ReservationsDetails.TerminalId
                                INNER JOIN Reservations ON ReservationsDetails.IdReservation = Reservations.IdReservation
                                WHERE Etat !=?)
           ";
     
            $pdo =  \DB::connection()->getPdo();
            $r = $pdo->prepare($sql);
            $r->execute([4]);
            $t = $r->fetchAll(\PDO::FETCH_OBJ);
     
            return $t;
        }

    Une autre où je pense qu'il fait la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     public static function terminal(){
     
           $sql = "
           SELECT Terminaux.*
                FROM Terminaux
                WHERE Terminaux.IdTerminal NOT IN (
                                SELECT Terminaux.IdTerminal
                                FROM Terminaux INNER JOIN ReservationsDetails ON Terminaux.IdTerminal=ReservationsDetails.TerminalId
                                INNER JOIN Reservations ON ReservationsDetails.IdReservation = Reservations.IdReservation
                                WHERE Etat !=?)
           ";
     
            $t = \DB::select($sql,[4]);
     
            return $t;
        }

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2015
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    @MaitrePylos

    Merci pour cette solution, cela a fonctionné !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL-5.0] Activer le "log-queries-not-using-indexes"
    Par Chochal dans le forum Administration
    Réponses: 4
    Dernier message: 07/12/2015, 21h05
  2. [5.1] Requête et sous requête avec query builder et laravel
    Par PIEPLU dans le forum Laravel
    Réponses: 1
    Dernier message: 01/11/2015, 14h28
  3. could not execute query
    Par nabil148911 dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/07/2007, 15h37
  4. Query IS NOT
    Par jobouga dans le forum Outils
    Réponses: 6
    Dernier message: 25/05/2007, 23h12
  5. The query could not be executed
    Par Mooglie77 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/04/2007, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo