【问题标题】:How to order a CakePHP query by an aggregate function on an associated table's field?如何通过关联表字段上的聚合函数对 CakePHP 查询进行排序?
【发布时间】:2015-12-28 23:21:53
【问题描述】:

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

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

数据库:Personas has many PersonaHistory

【问题讨论】:

    标签: cakephp cakephp-3.0 query-builder


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。问题是查询要复杂得多,如果我要重建它,我更愿意只编写我已经完成并测试过并且运行良好的 SQL 查询。
    【解决方案2】:

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

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

    【讨论】:

    • 更改表名会使Cake 表现不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2018-02-22
    • 2021-03-20
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多