Cakephp 3 - 按两列排序,为null

时间:2016-11-11 11:51:17

标签: sql cakephp cakephp-3.0

目前,我遇到了在一个特定表中同时对两列进行排序的问题。在这种情况下,需要对特定列(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代码?

1 个答案:

答案 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文档。