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 :

QueryBuilder : jointure problème syntaxe


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 47
    Points
    47
    Par défaut QueryBuilder : jointure problème syntaxe
    Bonjour,

    J'ai deux entités Candidate et Interview avec une relation 1 à n. L'entité Interview comprend donc un champ candidate_id.

    Mon but est d'afficher un tableau avec pour chaque candidat :

    - id
    - nom
    - prenom
    -....
    -total interviews (c'est ici que je bloque)

    Actuellement je fais une requête simple qui affiche tous les candidats actifs.

    Ce que j'aimerais, c'est afficher la liste des candidats avec pour chacun d'eux le nbr total d'interviews.

    Je suppose donc que je dois passer par une jointure, faire un count et un groupeBy. Bien que je comprenne bien ce que je dois faire, je ne sais pas comment le formuler concrètement.

    Je suppose que ça devrait ressembler à qqch comme cela (à quelques erreurs près bien sûr):

    SELECT Candidate.LastName, Candidate.FirstName, Interview.id
    FROM Candidate
    INNER JOIN Interview
    ON Candidate.id=Interview.candidate_id
    GROUP BY Candidate.id

    mais avec la syntaxe des helpers Doctrine, je vois pas trop ) J'ai jeté un coup d'oeil à la doc mais bon ce type d'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $qb->innerJoin('u.Group', 'g', 'ON', 'u.group_id = g.id AND g.name = ?1')
    ne m'aide pas des masses.

    Je n'ai jusqu'à présent été confronté à aucune jointure dans mon projet SF2. J'ai donc pour le moment toujours utilisé des choses assez simple comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public function getOnlyActive ()
    	{
     
    		$qb = $this->createQueryBuilder('a');
     
    		$qb->where("a.ACTIVE = 'active'");
     
     
    		return $qb->getQuery()->getResult();
    	}
    Pourriez-vous me donner quelques infos ? ou me donner des liens où je peux trouver des exemples concrets svp ?

    EDIT :

    J'ai essayé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public function getActiveAndCountInterviews ()
    	{
     
    		$qb = $this->createQueryBuilder('a','b');
     
    		$qb->select('a.Firstname')
    			  ->from('Candidate a','Interview b')
    			  ->innerJoin('a.Candidate', 'b', 'ON', 'a.id = b.candidate');
    		return $qb->getQuery()->getResult();
    	}
    Mais sans succès.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Bon, j'ai un peu avancé sur ma requête.

    Je fais donc ceci (à partir de mon entité Interview et non Candidate) car relation unidirectionnelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public function getActiveAndCountInterviews ()
    	{
     
    		$qb = $this->createQueryBuilder('i');
     
    		$qb->innerJoin('i.candidate', 'c');
     
    		return $qb->getQuery()->getResult();
    	}
    Je n'ai donc pas d'erreur au niveau de ma requête.

    Cependant je n'arrive pas à récupérer mes candidats. Comment dois-je modifier ma requête ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Bonjour;
    alors, voilà une solution parmi d'autres :

    1. Ajouter la meta données OnToMany pour le champ interview dans l'entity Candidate

    2. Ajouter le getter getInterview()
    3. Ajouter une fonction getNbrInterview() dans laquelle tu vas calculer le nombre total des interview.
    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function getNbrInterview() {
       $nbr_interview = 0;
           foreach($this->getInterview() as $value){
              $nbr_interview++;
           }
        retrun $nbr_interview;
    }
    4. et dans la vue, tu vas juste appeler la fonction getNbrInterview() pour chaque candidate

    .

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Comme tu as pu le remarquer je suis encore débutant dans SF2.
    Jusque maintenant je n'ai jamais eu à appeler une fonction directement dans la vue. Je l'ai toujours fais via le controleur. Mais dans ce cas, ça semble effectivement nécessaire.

    Bête question donc mais comment appeler cette fonction dans la vue ?

    REM : mais il doit bien y avoir moyen de récupérer le total des interview par candidate en une requête à l'aide du Querybuilder, non ? Ce serait quand même plus optimisé, non ? de plus, au niveau de la séparation des couches (MVC), c'est pas top d'appeler des fonction dans les vues, non ?

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Bête question donc mais comment appeler cette fonction dans la vue ?
    Twig:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {% for candidate in theList %}
        {{ candidate.getNbrInterview() }}
    {% endfor %}

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Je viens d'essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    			{% for entity in entity %}
    				<tr>
    					<td class="table_type_00_standard_tbody">{{ entity.id }}</td>
    					<td class="table_type_00_standard_tbody">{{ entity.lastname }}</td>
    					<td class="table_type_00_standard_tbody">{{ entity.getNbrInterview() }}</td>
     
    				</tr>
     
    			{% endfor %}

    Mais je reçois un merveilleux message d'erreur :

    Method "getNbrInterview" for object "Adl\HiringBundle\Entity\Candidate" does not exist in "AdlHiringBundle:Candidate:index.html.twig" at line 80

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Déjà dans ton code, les deux variables semblent les mêmes.

    {% for entity in entity %}

    et pour le message d'erreur, il te faut juste l’étape 3 ( ma première réponse)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Oui c'est normal vu que dans mon controleur c'est la valeur que j'utilise donc entity (stock l'occurence) in entity (array).

    Oui ça marche impecc !!

    Merci.

    NB: concernant ma remarque sur la relation unidirectionelle etc dans mon précédent post, qu'en dis-tu ?

  9. #9
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Au lieu du foreach tu peux simplement faire un count($this->interviews).

    Et puis le for entity in entity, même si ca marche (ce qui est étrange au passage), on a vraiment rien de plus moche. Fais for candidat in candidats, qqch de logique quoi.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/04/2006, 14h22
  2. [Tableaux] problème syntaxe concaténation variable
    Par mussara dans le forum Langage
    Réponses: 3
    Dernier message: 01/03/2006, 11h24
  3. Problème syntaxe sql
    Par devdev dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 11/04/2005, 16h31
  4. problème syntaxe sql
    Par mpat dans le forum ASP
    Réponses: 6
    Dernier message: 01/02/2005, 19h28
  5. Réponses: 2
    Dernier message: 08/03/2004, 15h10

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