Symfony2 中的条件关系


Conditional Relationship in Symfony2

假设我有一个帖子实体和一个评论实体。评论可以由管理员批准或不批准(这是数据库中的标志(。帖子实体具有:

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

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

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

怎么可能在这里只加载已批准的评论?

想法 #1

您可以使用Inheritance mapping:https://www.doctrine-project.org/projects/doctrine-orm/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 个表不能"有条件地"关联,因为这些关系基于主键。

你至少在这里有解决方案

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

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

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

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