在我的代表资产管理系统的Symfony2应用程序中,有一个名为Asset的实体。此实体与另一个名为AssetLog的实体具有OneToMany关系。每个AssetLog都链接到一个Status,它也是一个实体。
例如: 可能有一个名为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查询中)。
答案 0 :(得分:1)
我在“普通”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)