Symfony2中的条件关系

时间:2014-12-02 14:09:14

标签: php symfony doctrine entity-relationship

假设我有一个Post实体和一个Comment实体。管理员可以批准或不批准评论(这是数据库中的标志)。邮政实体有:

/**
 * @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
 */
protected $comments;

我还想要第二个属性,如下所示:

/**
 * @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
 */
protected $approvedComments;

如何在此处仅加载已批准的评论?

3 个答案:

答案 0 :(得分:1)

这不能通过您描述的关系来实现。 2个表格不能相关"有条件的"因为关系是基于主键的。

这里至少有解决方案

  1. 保留"评论"带有注释的实体上的字段,从批准的注释字段中删除注释,因为它与ORM理解的注释相同。然后你会有 - > getComments()函数来获取所有注释,你可以添加一个函数" getApprovedCommentsForPost($ post)"在你的repostitory课程中检索那些已批准的课程。
  2. 您可以区分具有单一继承的注释,因此您可以在一个表中使用Comment类和ApprovedComment类,然后您可以在您的实体上建立2个关系(请在此处阅读doctrine-orm.readthedocs.org/en /latest/reference/inheritance-mapping.html#single-table-inheritance)
  3. 从评论存储库中检索数据时,默认情况下可以使用学说过滤器过滤掉未批准的注释

答案 1 :(得分:1)

想法#1

您可以使用Inheritance mappinghttp://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

这个想法会为每种类型(已批准和未批准)提供单独的类,但要将所有内容存储在单个表中(SINGLE_TABLE继承)。

您需要有额外的列来存储类型识别器。

然后,你会:

/**
 * @ORM\OneToMany(targetEntity="ApprovedComment", mappedBy="post")
 */
protected $approvedComments;

/**
 * @ORM\OneToMany(targetEntity="NonApprovedComment", mappedBy="post")
 */
protected $nonApprovedComments;

明显的缺点是创建额外的类。

想法#2

您可以调整Query / QueryBuilder,如:

`SELECT p, c FROM AcmeDemoBundle:Post p LEFT JOIN p.comments c WITH c.approved = FALSE`

这个想法似乎更合理。

答案 2 :(得分:0)

您无法在实体中定义该约束。以下是相关文档:

http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-onetomany

正如您所看到的,没有与条件相关的选项。您必须使用QueryBuilder定义此条件。