2010-07-24 4 views
0

mon entrée en configuration estDoctrine DQL: Sélectionnez les entités ayant des enfants/FK relations à la table

Teachers (id, name) 
Students (id, name, teacher [FK]); 

Comment sélectionner dans DQL les enseignants qui ont des élèves? Je suppose que ce sera quelque chose comme

select t FROM Entities\Teachers t WHERE count(t.students) > 0 

mais je sais count(t.students) > 0 est mal ... à quoi sert-je alors?

MISE À JOUR

maintenant ce que vers une relation plusieurs à plusieurs auto-référencement? où un utilisateur peut être un enseignant ou un étudiant ou les deux ... code ci-dessous ... quel est le DQL pour obtenir des utilisateurs qui ont des étudiants?

/** @Entity @Table(name="users")) */ 
class User { 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @Column(type="string", length="30") 
    */ 
    private $name; 
    /** 
    * @ManyToMany(targetEntity="User", inversedBy="teachers") 
    * @JoinTable(name="Teachers_Students", 
    *    joinColumns={@JoinColumn(name="teacher", referencedColumnName="id")}, 
    *    inverseJoinColumns={@JoinColumn(name="student", referencedColumnName="id")} 
    *    ) 
    */ 
    private $students; 
    /** 
    * @ManyToMany(targetEntity="User", mappedBy="students") 
    */ 
    private $teachers; 

Répondre

1

Vous pouvez utiliser une jointure dans ce cas.

select t FROM Entities\Teachers as t 
innerjoin Entities\Students as s on t.id = s.teacher 

Si vous pouvez configurer votre base comme suit, vous pouvez gérer votre cas très facilement. Si loin de mon expérience, je sais que la doctrine peut gérer plusieurs à plusieurs relations de la meilleure façon.

$this->hasMany('User as Students', array(

     'local'  => 'id', 

     'foreign' => 'student_id', 

     'refClass' => 'UserToStudents', 

     'onDelete' => 'CASCADE')); 

$this->hasMany('User as Teachers', array(

     'local'  => 'id', 

     'foreign' => 'teacher_id', 

     'refClass' => 'UserToTeachers', 

     'onDelete' => 'CASCADE')); 

Merci

+0

ok, maintenant ce que je fais une entité de référencement auto. voir ma mise à jour –

+0

J'ai mis à jour mon commentaire. S'il vous plaît laissez-moi savoir clairement ce que vous voulez savoir. – Muhit

+0

hmm ... je ne suis pas familier avec cela (mais est-ce de la doctrine 1.2? Cos j'utilise 2.0). où est le code censé aller? et où puis-je lire les docs ou quoi que ce soit à ce sujet? –

Questions connexes