如何实现条件排序?

时间:2017-05-03 08:38:24

标签: cakephp orm query-builder cakephp-3.x

我试图找出如何在ORM find()方法中的cakephp3顺序函数中创建自定义顺序函数。

假设我有以下模型

User
  name
  ...
  custom_data

custom_data
   type

每个用户都有一个自定义数据,其中type是[20,30,40]之一。

我需要按以下方式订购

if ( type == 20 ) {
    // put in first positions
} else {
   // put this records after users with custom_data->type != 20 
}

我需要在paginator中使用它,所以我需要像

这样的东西
$this->Users
   ->find()
   ->where([ something ] )
   ->order( 'ASC' => here is my custom function )

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

首先,根据您的描述,听起来好像您需要使用DESC,因为您说您想要首先匹配条件的记录。按升序排列,这些记录将持续到位。

话虽这么说,最简单的方法是使用基本条件,即SQL明智之类的东西:

ORDER BY type = 20 DESC

它也可以使用CASE语句来解决,但如果你有这么简单的要求,它就不是必需的。

$query = $this->Users->find();
$query
    ->where(/* .. */)
    ->orderDesc(
        $query->newExpr()->add(['type' => 20])
    );

可以通过对order()orderAsc()orderDesc()的其他来电添加更多订购声明。

另见