Доктрина DQL: выбор сущностей, имеющих детей / отношения к таблице FK - PullRequest
0 голосов
/ 24 июля 2010

при условии, что мои настройки

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;

1 Ответ

1 голос
/ 24 июля 2010

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

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

Спасибо

...