在 entityRepository 中查找已连接实体的最后一个实体(Symfony2 & Doctrine2)



在代表资产管理系统的Symfony2应用程序中有一个名为Asset的实体。该实体与另一个名为AssetLog的实体具有一多关系。每个AssetLog都链接到一个Status,该Status也是一个实体。

例如

:可能有一个资产叫Car。这辆车有一个日志,记录了它发生了什么,什么时候发生的,以及谁对此负责。每个日志条目都链接到一个状态,可以是:完美状态、损坏、丢失、被盗等。

我要做的是在资产存储库中编写一个查询,该查询将为我提供具有特定状态的所有资产,例如被盗。

这意味着例如:所有的汽车,其最近的日志条目链接到状态被盗。

我正在努力解决我需要每个资产的最后一个日志条目的事实。只有当条目链接到一个特定的状态时,我才需要资产。

在我的具体示例中,曾经被盗但又被归还的汽车不应该出现在列表中。

是否有人知道这是可能的使用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查询中)丢失了。

我曾经在"正常"SQL中遇到过这个问题。为此,您需要一个子查询:创建一个WHERE条件,将每个日志条目的当前时间戳(或者序列号,如果您喜欢的话)与该日志的最大时间戳进行比较。要获得这个最大值,您需要子查询。

类似这样的东西(我不太确定,如果我的子查询满足学说语法;但我想你会明白的):

SELECT a FROM asset
JOIN a.log l
JOIN l.status s
WHERE s.statusCode = ?
AND (l.timestamp = (SELECT MAX(timestamp) FROM log l2 WHERE l2.assetId = a.id)

最新更新