【问题标题】:Doctrine - Query with condition on related entityDoctrine - 查询相关实体的条件
【发布时间】:2015-05-21 04:14:12
【问题描述】:

我有这个架构:

 Entity        Doctrine-generated        Entity
+++++++++       ++++++++++++++++        +++++++
+Student+ ----- +Student/Events+ ------ +Event+
+++++++++       ++++++++++++++++        +++++++

这就是说一个学生可以有很多事件,并用多对多关系表示。学生是关系的拥有者。

每个Event 都添加一个增量id,并与Student 关联。当然,由于ManyToMany,映射表是由学说自动生成的。

我为此使用event sourcing,因此每个Student 都有一个status,该状态是学生的最后一个事件。

现在我想获取所有具有给定状态的Students,例如“IN_REVIEW”。请记住,状态由学生的最后一个事件表示。

¿我怎样才能在一次访问数据库的过程中用教义做到这一点?更具体地说,我想使用查询生成器来执行此操作。

PD:我有以下代码:

  $qb->select('a')
  ->from("DnDRaHApiBundle:Student", "a")
  ->leftJoin("a.status", "s");

但不知道如何查询映射表。我已经考虑过以反向 id 顺序获取 Student 的所有 Events,然后使用它来查询学生,但我不喜欢这种方法,必须有更好的方法。

【问题讨论】:

  • 因此,您有多个学生的事件和事件类型,并且您想要获取具有特定事件类型的所有学生,该事件类型是他们最近的事件? Application 实体如何适应这个?
  • @Richard 我复制粘贴了我的代码而不更改它,我现在就编辑它......但在这种情况下,Application == Student

标签: php mysql symfony doctrine-orm event-sourcing


【解决方案1】:

根据我的理解,我可以建议你:

$qb->select('Distinct a')
  ->from("DnDRaHApiBundle:Application", "a")
  ->leftJoin("a.status", "s")
  ->where('s.name = :name')//change name and put your real attribute
  ->orderBy('s.id','Desc')//the most recent have a the higher id
  ->setParameter('name','APPROVED');

【讨论】:

  • 这种方法存在问题,我会得到处于状态(事件)但当前不是的学生。例如,假设一个学生在他的生命周期中有这样的事件链:PENDING、IN_REVIEW、ACCEPTED,并且我查询所有学生 IN_REVIEW。我会找回一个被批准的学生,这是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多