1

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

例如:可能有一个名为 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 查询中一样)丢失了。

4

1 回答 1

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)
于 2013-04-03T08:22:03.537 回答