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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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

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