【问题标题】:Doctrine DQL: Select entities having children/relations to FK tableDoctrine DQL:选择与 FK 表有子项/关系的实体
【发布时间】:2010-07-24 15:28:04
【问题描述】:

假设我的设置是

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;

【问题讨论】:

    标签: doctrine dql


    【解决方案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')); 
    

    谢谢

    【讨论】:

    • 好的,现在我正在做一个自引用实体。查看我的更新
    • 我更新了我的评论。请让我清楚地知道您还想知道什么。
    • hmm...我对此并不熟悉(但这是来自学说 1.2 的吗?因为我使用的是 2.0)。代码应该去哪里?我在哪里可以阅读文档或其他任何内容?
    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多