目前,我遇到了在一个特定表中同时对两列进行排序的问题。在这种情况下,需要对特定列(modified_timeline)进行排序,但是当此列为null时,我希望使用另一列的时间戳进行排序(创建)。我有以下查询:
return $this->find()
->contain([
'Comments' => function ($q){
return $q
->contain(['Users' => function ($q) {
return $q->select($this->select);
}])
->order(['Comments.created' => 'ASC']);
},
'Users' => function ($q) {
return $q->select($this->select)
->contain(['Pictures' => function ($q) {
return $q->where(['Pictures.profile_photo' => true]);
}]);
},
'Albums'
])
->matching('Albums.Users', function ($q) use ($userId) {
return $q->where(['Users.id' => $userId]);
})
// This particular line:
->order([
'Pictures.modified_timeline' => 'DESC',
'Pictures.created' => 'ASC'
]);
这种方法只能部分地工作,因为它没有考虑到modified_timeline可以为null。我正在考虑使用case表达式来解决这个问题但是我并不真正理解如何在case表达式中应用isNull()函数。以下SQL代码解释了我想要的内容:
ORDER BY
CASE
WHEN Pictures.modified_timeline is null
THEN Pictures.created
ELSE Pictures.modified_timeline
END
因此,我的问题是如何使用Cakephp 3查询构建器创建上面的SQL代码?
答案 0 :(得分:0)
此查询按上述yo生成sql:
->order(function ($exp, $q) {
return $exp->addCase(
[
$q->newExpr()->eq('modified_timeline', null),
//$q->newExpr()->gt('modified_timeline', 0), // or you may change condition here
],
['Pictures.created','Pictures.modified_timeline'], // values matching conditions
['string', 'string'] // type of each value (optional)
);
有关详细信息,请参阅cakephp文档。