我正在使用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会破坏排序。所以我想到了一个max-aggregate-function来保存订单。
但是我得到了cakephp框架的以下错误消息:
错误:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与MySQL服务器版本相对应的手册,以便在MAX" MAX(`messages`__`max_date`)附近使用正确的语法,Messages.id AS`Messages__id`,Messages.sender_id A'在第1行
所以有人都知道,我的查询有什么问题?我尽力遵循文档中的示例。
为什么会说messages
__ max_date
而不是messages
。max_date
?
答案 0 :(得分:0)
根本不是你如何定义计算字段和对应别名,这需要以key => value
方式完成,即
'fields' => [
'max_date' => 'MAX(`Messages`.`date_time`)',
// ...
]
会导致像
这样的SQL片段MAX(`Messages`.`date_time`) AS `max_date`
请参阅Cookbook > Database Access & ORM > Query Builder > Selecting Data
另外,作为提示,您可能希望使用表达式而不是简单字符串,以便CakePHP可以在需要时正确创建特定于平台的SQL。 MAX
并未影响AFAIR,因此这只是一般性提示。
$query = $this->Messages->find();
$query
->select([
'max_date' => $query->func()->max($this->Messages->aliasField('date_time'))
// ...
])
// ...
参见 Cookbook > Database Access & ORM > Query Builder > Using SQL Functions