Doctrine DQL: выберите сущности, имеющие дочерние элементы/отношения с таблицей FK

предполагая, что моя установка

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

как выбрать в DQL учителей, у которых есть ученики? я думаю, это будет что-то вроде

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

но я знаю, что count(t.students) > 0 неправильно... что мне тогда использовать?

ОБНОВИТЬ

теперь, что насчет отношений многие ко многим? где пользователь может быть учителем, учеником или обоими... код ниже... что такое DQL для получения пользователей, у которых есть ученики?

/** @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;

person Jiew Meng    schedule 24.07.2010    source источник


Ответы (1)


В этом случае вы можете использовать соединение.

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

Если вы можете настроить свою базу следующим образом, вы легко справитесь со своим делом. Насколько я знаю из своего опыта, доктрина может наилучшим образом справляться с отношениями «многие ко многим».

$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')); 

Спасибо

person Muhit    schedule 24.07.2010
comment
хорошо, теперь к тому, что я делаю самоссылающейся сущностью. посмотри мое обновление - person Jiew Meng; 24.07.2010
comment
Я обновил свой комментарий. Пожалуйста, дайте мне четко знать, что еще вы хотите знать. - person Muhit; 24.07.2010
comment
хм... я не знаком с этим (но это из доктрины 1.2? потому что я использую 2.0). куда код должен идти? и где я могу прочитать документы или что-то в этом роде? - person Jiew Meng; 24.07.2010