如何通过关联的 table 字段上的聚合函数对 CakePHP 查询进行排序?

How to order a CakePHP query by an aggregate function on an associated table's field?

我想通过关联的 table 字段上的聚合函数进行排序,但是当我调试正在执行的 SQL 查询时,关联的 table、PersonaHistory 甚至没有得到 JOINed,当然我也没有得到任何结果。
有办法实现吗?
我可以强制在查询中加入 table 吗?

$query = $this->Personas->find('all')
    ->contain(['PersonaHistory'])
    ->order(['MAX(PersonaHistory.updated)' => 'ASC'])
    ->group('PersonaHistory.persona_id');  

数据库:Personas has many PersonaHistory

您的 table 名称需要复数化,您可以直接在关联的 table 字段上执行订单和分组

<?php $query = $this->Personas->find('all')->contain([
    'PersonaHistories' => function ($q) {
        return $q->order(['Max(updated)' => 'ASC'])
                 ->group('persona_id');
    }]);

看起来 Personas 通过 hasManyPersonaHistory 相关。只有 hasOnebelongsTo 关联会产生 JOIN 语句。

解决方法是将您的查询重写为:

$query = $this->PersonaHistory->find('all')
    ->contain(['Personas'])
    ->order(['MAX(PersonaHistory.updated)' => 'ASC'])
    ->group('PersonaHistory.persona_id');