Doctrine2 +加入条件

时间:2010-11-25 08:21:20

标签: doctrine-orm

首先,我要对Doctrine开发人员表示非常感谢,你们是摇滚乐的人! 我的问题如下:

我有三张桌子:

person (id, name, isActive)
email (id, address, isActive)
personEmailRel(id, personId, emaiId, isActive)

我希望按人名列出电子邮件:

/**
 * Unidirectional - Many persons have many emails
 *
 * @ManyToMany(targetEntity="Address_Model_Email")
 * @JoinTable(name="personEmailRel",
 *   joinColumns={@JoinColumn(name="personId", referencedColumnName="id")},
 *   inverseJoinColumns={@JoinColumn(name="emailId", referencedColumnName="id")}
 * )
 */
private $_emails;

public function __construct()
{
    $this->_emails = new Collections\ArrayCollection();
}

public function getEmails()
{
    return $this->_emails;
}

工作正常。但问题是我还想在join子句中设置加法条件 isActive = 1。如何在Doctrine2中解决这个问题?感谢。

2 个答案:

答案 0 :(得分:0)

您不使用ManyToMany但是创建第三个实体PersonEmail。

我发现您的数据库架构非常值得怀疑。为什么电子邮件有很多人?在这种情况下,OneToMany关系不应该足够吗?我没有看到连接表的好处。

答案 1 :(得分:0)

Doctrine不支持关联条件,但有几种方法可以解决这个问题:

创建一个存储库方法,用于查询所需的相关实体。请参阅QueryQueryBuilder

使用Collection Criteria API过滤getter中的非活动实体(在您的实体中)。如果关联标记为“EXTRA_LAZY”,则将使用优化查询而不是检索整个集合。这对于大型集合非常有用。

使用Filter API过滤数据库级别的非活动实体。当您几乎总想隐藏不活动(或已删除等)实体时,这非常有用。