假设我有一个帖子实体和一个评论实体。评论可以由管理员批准或不批准(这是数据库中的标志(。帖子实体具有:
/**
* @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 个表不能"有条件地"关联,因为这些关系基于主键。
你至少在这里有解决方案
- 将"注释"字段保留在带有注释的实体上,从批准的注释字段中删除注释,因为它与ORM理解的注释相同。然后,您将拥有 ->getComments(( 函数来获取所有注释,并且可以在 repostitory 类中添加一个函数 "getApprovedCommentsForPost($post(" 来检索那些已批准的注释。
- 您可以区分具有单个继承的注释,例如,您将在一个表中拥有一个 Comment 类和一个 ApprovedComment 类,然后您可以在实体上建立 2 个关系(阅读此处 doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html#single-table-inheritance(
- 默认情况下,从评论存储库检索数据时,可以使用原则过滤器过滤掉未经批准的评论
您不能在实体中定义该约束。以下是相关文档:
http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-onetomany
如您所见,没有与条件相关的选项。您必须使用 QueryBuilder 定义此条件。