2013-04-03 88 views
1

在我的Symfony2应用程序中,代表资产管理系统的是一个名为Asset的实体。该实体与称为AssetLog的另一实体具有OneToMany关系。每个AssetLog都链接到一个也是实体的状态。在entityRepository中查找联合实体的最后一个实体(Symfony2&Doctrine2)

例如: 可能有一个名为Car的资产。 这辆车记录了它发生了什么,发生了什么事,谁负责这件事。 每个日志条目链接到一个状态可能是:完美的条件,损坏,丢失,被盗等

我想要做的是在assetrepository中写一个查询,将给我所有的资产与一个被盗。

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

我很苦恼,因为我需要每个资产的最后一个日志条目。只有当该条目链接到特定状态时,才需要该资产。

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

有谁知道这是否可以使用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

我在“普通”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) 
+0

善于思考!我能够在Doctrine2语法中创建连接。子选择查询还没有,但如果有人知道如何实现这个...?感谢弗朗索瓦! –

相关问题