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

Symfony PHP Discussion :

[Symfony 2.7.0]Doctrine query builder [2.x]


Sujet :

Symfony PHP

  1. #1
    Invité
    Invité(e)
    Par défaut [Symfony 2.7.0]Doctrine query builder
    Bonjour,

    J'ai cette relation :

    entreprise one-to-many salarié one-to-many voiture

    J'aimerais sélectionner tous les salariés qui n'ont pas de voiture mais je suis bloqué...

    J'ai la contrainte de sélectionner aussi que les salariés appartenant à l'entreprise passer en paramètre et différents de celui passer en paramètre.

    Voici ce que j'ai commencé à faire :

    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
    21
    22
    23
     
        public function queryfindByEntrepriseId($entreprise, $salarie = null)
        {
            $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
                      ->where('salaries.voiture = :voiture')
                      ->setParameter('voiture', null );
     
            if($salarie){
                $q->andWhere('salarie.id != :salarie')
                  ->andWhere('entreprise.id = :entreprise')
                  ->setParameter('salarie',$salarie);
            }else{
                $q->andWhere('entreprise.id = :entreprise');               
            }
     
            $q->setParameter('entreprise',$entreprise);
     
            return $q;
     
        }
    Je comprends que cela ne puisse pas marcher, mais je ne vois pas comment faire pour que ça fonctionne...
    J'imagine qu'il y a peut être une sous requête à faire?

    Merci pour votre aide.

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    quand on écrit une requête un peu complexe on procède par étape.

    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
    j'otiens un résultat ?


    oui --> 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
                      ->where('salaries.voiture = :voiture')
                      ->setParameter('voiture', null );
    je n'ai pas de résultat donc il y a un problème avec voiture et null ??????

    et on cherche ... ma base de donnée il y a bien un null dans les champs ? ....... etc.....


    etc....

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Je crois qu'il est préférable de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->where('salaries.voiture IS NULL')

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dukoid Voir le message
    quand on écrit une requête un peu complexe on procède par étape.

    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
    j'otiens un résultat ?


    oui --> 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
                      ->where('salaries.voiture = :voiture')
                      ->setParameter('voiture', null );
    je n'ai pas de résultat donc il y a un problème avec voiture et null ??????

    et on cherche ... ma base de donnée il y a bien un null dans les champs ? ....... etc.....


    etc....
    Merci pour ta réponse.
    C'est exactement la méthode que j'ai appliqué vois tu. Mais parfois on a besoin d'être guidé car on ne sais pas faire.
    Je sais que ma requête ne peux pas fonctionner car il n'est sûrement pas possible de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                      ->where('salaries.voiture = :voiture')
                      ->setParameter('voiture', null );
    étant donné qu'un salarié peut avoir plusieurs voiture. Malheureusement je ne connais pas le moyen de le faire.
    Je cherche donc quelqu'un qui pourra me l'expliquer mais pas me faire un cours sur ma façon de déboguer mon code.
    1 fois sur 2 on a droit à ce genre de réponse sur les forums. Peu importe la raison... ce n'est pas la réponse à la question.

  5. #5
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Est-ce que la méthode de billy fonctionne ?

    je ne voit pas trop pkoi la tienne ne fonctionnerait pas a vrai dire.

    pierre

  6. #6
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    loin de moi l'idée de donner un cours à quiconque, je voulais identifier quel partie du code était erroné.

    si tu relis ton message de départ tu ne donnes aucune erreur, tu ne donnes aucune indication sur la partie du code qui ne fonctionne pas. tu parles même de sous requête
    si tu avais écris "la condition du null ne fonctionne pas, comment faire ?. puisque apparemment, tu connaissais cette information. dans ce cas tu aurais eu très certainement une réponse plus adapté voir aucune de ma part (parceque je ne sais pas)

    à question précise, réponse précise....


    et donc ça donne quoi la réponse de Billy ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci à tous pour vos réponses.
    En me relisant je viens de voir que j'avais oublié un s... en fait voiture est voitures
    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
    21
    22
    23
     
    public function queryfindByEntrepriseId($entreprise, $salarie = null)
        {
            $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
                      ->where('salaries.voitures = :voitures')
                      ->setParameter('voitures', null );
     
            if($salarie){
                $q->andWhere('salarie.id != :salarie')
                  ->andWhere('entreprise.id = :entreprise')
                  ->setParameter('salarie',$salarie);
            }else{
                $q->andWhere('entreprise.id = :entreprise');               
            }
     
            $q->setParameter('entreprise',$entreprise);
     
            return $q;
     
        }
    La méthode de Billy12 ne solutionne pas mon problème, j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Invalid Path Expression. StateFieldPathExpression or SingleValueAssociationField expected.

  8. #8
    Invité
    Invité(e)
    Par défaut
    J'ai fait évolué ma requête car mon besoin a évolué, mais j'ai une nouvelle erreur :

    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
    21
    22
    23
     
    public function queryfindByEntrepriseId($entreprise, $salarie = null)
        {
            $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
                      ->leftJoin('salaries.voitures', 'voitures')
                      ->where('voitures.dispo is NULL');
     
            if($salarie){
                $q->andWhere('salarie.id != :salarie')
                  ->andWhere('entreprise.id = :entreprise')
                  ->setParameter('salarie',$salarie);
            }else{
                $q->andWhere('entreprise.id = :entreprise');               
            }
     
            $q->setParameter('entreprise',$entreprise);
     
            return $q;
     
        }
    Voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A single-valued association path expression to an inverse side is not supported in DQL queries. Use an explicit join instead

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai modifié en mettant ceci :
    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
    21
    22
    23
    24
     
    public function queryfindByEntrepriseId($entreprise, $salarie = null)
        {
            $q = $this->createQueryBuilder('salarie')
                      ->leftJoin('salarie.entreprise', 'entreprise')
                      ->addSelect('entreprise')                  
                      ->leftJoin('entreprise.salaries', 'salaries')
                      ->leftJoin('salaries.voitures', 'voitures')
                      ->leftJoin('voitures.dispo', 'dispo')
                      ->where('dispo is NULL');
     
            if($salarie){
                $q->andWhere('salarie.id != :salarie')
                  ->andWhere('entreprise.id = :entreprise')
                  ->setParameter('salarie',$salarie);
            }else{
                $q->andWhere('entreprise.id = :entreprise');               
            }
     
            $q->setParameter('entreprise',$entreprise);
     
            return $q;
     
        }
    Je n'ai plus de message d'erreur, mais le résultat est faux : la requête me remonte aussi les cas où dispo n'est pas NULL...

  10. #10
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Et en enlevant le addSelect('entreprise') ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Billy12 Voir le message
    Et en enlevant le addSelect('entreprise') ?
    Pareil. Je croyais qu'il était obligatoire de mettre un addSelect après chaque leftJoin mais j'ai vu que non. A quoi ils servent alors?

  12. #12
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Si dispos est une table tu dois aussi modifier le where en dispo.id IS NULL

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Billy12 Voir le message
    Si dispos est une table tu dois aussi modifier le where en dispo.id IS NULL
    Dispo est bien une table, la relation entre dispo et voiture est one-to-one.
    J'ai mis le dispo.id is NULL mais toujours le même résultat.

    Je voudrais toutes les voitures qui n'ont pas de relation avec dispo...

  14. #14
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Pour t'aider tu peux regarder ce que te donne un dump($q->getDQL()) ? Et si cela correspond á ce que tu veux ?

  15. #15
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Déjà si tu pars de ton entity entreprise tu dois faire un createQueryBuilder dessus
    Puis tu fais ton leftJoin de salaries
    Puis de voiture ....
    Désolé j'suis avec mon tel donc pour les copié collé c'est pas top

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Billy12 Voir le message
    Déjà si tu pars de ton entity entreprise tu dois faire un createQueryBuilder dessus
    Puis tu fais ton leftJoin de salaries
    Puis de voiture ....
    Désolé j'suis avec mon tel donc pour les copié collé c'est pas top
    Merci pour ton aide.
    Je ne pars pas de entreprise, je veux absolument récupérer les salariés sauf ceux qui ont des voitures avec dispo non null et sauf celui passé en paramètre de la méthode.
    Du coup, est ce que je mets toujours entreprise dans le createQueryBuilder?

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Billy12 Voir le message
    Pour t'aider tu peux regarder ce que te donne un dump($q->getDQL()) ? Et si cela correspond á ce que tu veux ?
    Le dump me donne un résultat pas mal, mais je pense que le dispo.id is NULL n'est pas bon.
    Là je suis en train de dire que je veux les voitures qui ont un dispo qui a un id NULL, or ne je pense pas que ça soit ça.
    Il n'y a rien pour dire je veux les voitures qui n'ont pas de lien avec dispo ?

  18. #18
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Mais c'est quoi dans ton getRepository ?
    Si c'est l'Entity Salaries (avec un S Normalement car c'est une collection ) tu fais un createQuertBuilder dessus en effet
    Puis leftJoin de voiture

    Et dispo c'est oneToOne ?
    Si oui
    Left joint dispo

    Et un where dispo.id is null

    Au final tu te fou d'entreprise c'est ça ?

  19. #19
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2015
    Messages : 20
    Par défaut
    Et Si dispo est un champ de voiture
    Tu fais un where voiture.dispo IS NUL

    Édit : tu m'as répondu c'est oneToOne
    Ce message n'est donc pas util

  20. #20
    Invité
    Invité(e)
    Par défaut
    Dans mon getRepository c'est salarie.
    dispo c'est one-to-one avec voiture.

    Entreprise je m'en fous pas car je veux les salariés de l'entreprise en paramètre, pas les autres.
    Dispo est une entité mais une voiture peut ne pas en avoir.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2.x] [Symfony2/Doctrine] Query Builder d'un ManyToMany
    Par Torrent007007 dans le forum Symfony
    Réponses: 4
    Dernier message: 16/10/2013, 08h39
  2. Réponses: 2
    Dernier message: 05/07/2007, 12h39
  3. Réponses: 3
    Dernier message: 20/06/2007, 14h31
  4. Réponses: 2
    Dernier message: 04/06/2007, 16h38
  5. Comment configurer active query builder
    Par davos56 dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/04/2007, 07h38

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