在代表资产管理系统的 Symfony2 应用程序中,有一个名为 Asset 的实体。该实体与另一个名为 AssetLog 的实体具有 OneToMany 关系。每个 AssetLog 都链接到一个状态,该状态也是一个实体。
例如:可能有一个名为 Car 的资产。这辆车记录了发生的事情、发生的时间以及谁对此负责。每个日志条目都链接到一个状态,该状态可能是:完美状态、损坏、丢失、被盗等。
我正在尝试做的是在assetRepository 中编写一个查询,它将为我提供具有特定状态的所有资产,比如Stolen。
例如,这意味着:其最近的日志条目与状态被盗相关联的所有汽车。
我正在努力解决我需要每个资产的最后一个日志条目这一事实。只有当该条目链接到特定状态时,我才需要资产。
在我的具体示例中,曾经被盗但再次归还的汽车不应出现在列表中。
有谁知道这是否可以使用 Querybuilder,如果可以,该怎么做?
编辑:
如果我描述我为在 SQL 中获得所需结果所做的工作,也许会有所帮助。这是我的 SQL 查询:
select *
from asset a
join asset_log l
on l.asset_id = a.id
left join asset_log l2
on l2.asset_id = l.asset_id
and l.id > l2.id
where l.receiver_id = 12345
group by l.asset_id
这很好用,但是如何在 DQL 中编写呢?这是我最好的尝试:
$qb->select('a', 'l', 'l2')
->from('AssetBundle:Asset', 'a')
->join('a.logEntries', 'l')
->leftJoin('a.logEntries', 'l2', 'ON', 'l2.asset = l.asset')
->where("l.receiver = 12345")
->andWhere('l.id > l2.id')
->groupBy('a.id')
此 DQL 查询执行时没有错误,但会给出不同的结果:应该可见的资产(就像它们在 SQL 查询中一样)丢失了。