Cakephp 内部连接(SELECT ...)

Cakephp INNER JOIN (SELECT ... )

Cakephp 版本:3.5.

我有一个索赔table。一个项目有很多要求。一个claim有一个project,一个number(1,2,3 and 运行),每个number可以修改多次。 project_id、数字和 rev_number 的组合构成了独特的声明。 Table 看起来像这样(在右侧我标记了查询中我想要的行):

+----+------------+--------+------------+---------+
| id | project_id | number | rev_number | i want  |
+----+------------+--------+------------+---------+
| 1  | 2          | 1      | 1          |         |
+----+------------+--------+------------+---------+
| 2  | 1          | 1      | 1          | <- this |
+----+------------+--------+------------+---------+
| 3  | 1          | 2      | 1          |         |
+----+------------+--------+------------+---------+
| 4  | 1          | 3      | 1          |         |
+----+------------+--------+------------+---------+
| 5  | 1          | 2      | 2          |         |
+----+------------+--------+------------+---------+
| 6  | 1          | 2      | 3          | <- this |
+----+------------+--------+------------+---------+
| 7  | 1          | 3      | 2          | <- this |
+----+------------+--------+------------+---------+

所以我想要每个索赔编号的最新版本(最高 rev_number),其中 project_id = 1。

我想用ORM生成的sql是这样的

SELECT Claims.*
FROM claims Claims
INNER JOIN (
    SELECT number, MAX(rev_number) AS latest
        FROM claims
        WHERE project_id = 1
        GROUP BY number) AS GroupedClaims
    ON GroupedClaims.number = Claims.number
    AND GroupedClaims.latest = Claims.rev_number;

这个sql如何用ORM生成? INNER JOIN (SELECT ... )是怎么产生的?在调查之后,我找不到 join()、innerJoin()、innerJoinWith() 或 matching() 的解决方案。

正如@ndm 所评论的那样,通过将 join()innerJoin() 与 queryObject((子)查询)一起使用,它有效。

$subq = $this->Claims->find()
            ->select(['number' => 'Claims.number', 'latest' => 'MAX(Claims.rev_number)'])
            ->where(['project_id' => $pid])
            ->group(['number']);

$query = $this->Claims->find()
            ->contain(['ClaimRows'])
            ->join([
                'GroupedClaims' => [
                    'table' => $subq,
                    'type' => 'INNER',
                    'conditions' => ['GroupedClaims.number = Claims.number', 'GroupedClaims.latest = Claims.rev_number']
                ]
            ])
            ->all();

$query = $this->Claims->find()
            ->contain(['ClaimRows'])
            ->innerJoin(
                ['GroupedClaims' => $subq],
                ['GroupedClaims.number = Claims.number', 'GroupedClaims.latest = Claims.rev_number'])
            ->all();