繁体   English   中英

在entityRepository(Symfony2和Doctrine2)中查找已加入实体的最后一个实体

[英]Finding last entity of a joined entity in entityRepository (Symfony2 & Doctrine2)

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

例如:可能有一个名为Car的资产。 这辆车记录了发生的事情,发生的时间以及对此负责的人。 每个日志条目都链接到一个状态,该状态可能是:状况良好,损坏,丢失,被盗等。

Stolen说,我想做的是在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查询中)。

我曾经在“普通” 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM