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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    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 confirmé
    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
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    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 confirmé
    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
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    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

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