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

时间:2013-04-03 08:01:15

标签: php symfony join doctrine-orm dql

在我的代表资产管理系统的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查询中)。

1 个答案:

答案 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)