0

我正在用 cakephp 3 开发一个社交应用程序。

我现在正在处理消息传递功能。它以这种方式工作,在左侧显示用户,与谁进行对话,中间是对话。

我希望用户按上次消息传递日期排序。意思是,如果彼得是我最后一个写信的人,那么彼得应该出现在最上面,依此类推。

我有以下查询:

$query = $this->Messages
    ->find('all', [
        'fields' => [
            'MAX(`messages`.`max_date`)',
            'id',
            'sender_id',
            'reciever_id',
        ]
    ])
    ->where([
        'sender_id = ' => $active_user_id
    ])
    ->orWhere([
        'reciever_id = ' => $active_user_id
    ])
    ->group([
        'sender_id',
        'reciever_id'
    ])
    ->order([
        'id' => 'DESC'
    ]);

出于性能原因,我添加了一个按 sender_id 和 reciever_id 分组,因为我不想接收所有消息,而只想找到我迄今为止写过的用户。

问题是 group-statement 破坏了排序。所以我想到了一个最大聚合函数来保留订单。

但是,我通过 cakephp 框架收到以下错误消息:

错误:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'MAX(`messages`__`max_date`), Messages.id AS `Messages__id`, Messages.sender_id A' 附近使用正确的语法

那么有人知道,我的查询有什么问题吗?我尽力遵循文档中的示例。

为什么它说messages__max_date而不是messagesmax_date?

4

1 回答 1

0

这根本不是您定义计算字段和对应别名的方式,这需要以一种key => value方式完成,即

'fields' => [
    'max_date' => 'MAX(`Messages`.`date_time`)',
    // ...
]

这将导致像这样的 SQL 片段

MAX(`Messages`.`date_time`) AS `max_date`

请参阅Cookbook > 数据库访问和 ORM > 查询构建器 > 选择数据

另外作为提示,您可能希望使用表达式而不是简单的字符串,以便 CakePHP 可以在需要时正确创建特定于平台的 SQL。MAX不影响 AFAIR,所以这只是一个一般性提示。

$query = $this->Messages->find();
$query
    ->select([
        'max_date' => $query->func()->max($this->Messages->aliasField('date_time'))
        // ...
    ])
    // ...

请参阅Cookbook > 数据库访问和 ORM > 查询生成器 > 使用 SQL 函数

于 2016-01-11T12:18:27.647 回答