如何在cakephp 3中编写orderByField查询

时间:2016-12-02 15:12:13

标签: mysql sql cakephp-3.0

在sql中,我有这个查询,它完美地工作并按照给定的数组排序"命令BY字段"。但是在cakephp它没有用。

SELECT * FROM users
WHERE users.Id IN (3,7,2,13)
ORDER BY FIELD(users.Id ,3,7,2,13)

我按照以下顺序获取用户。这是完美的

user _id
 3
 7
 2
13

Cakephp 3

 $unique_user_id_list = (3,7,2,13);
 $id_list = '3','7','2','13';      This is string. 

$users = $this->Users->find('all',[
                'contain' => [],           
                'conditions'=>['Id IN' => $unique_user_id_list],
                'order BY FIELD'=>['Users.Id'=>$id_list]
            ]);

在此查询中,我按以下顺序获取用户

user_id
  2 
  3
  7
 13

我尝试了两种方式,但没有人工作。只有"订单"子句给出错误,而另一个"按字段排序"没有错误,但没有按预期工作。

   'order'=>['Users.Id'=>$id_list]
    'order BY FIELD'=>['Users.Id'=>$id_list]

任何想法如何在cakephp 3中编写上面的sql查询以使其工作。

2 个答案:

答案 0 :(得分:1)

回答这个问题 简而言之,'order' => "FIELD(id, '2', '3', '7', '13')"

详细说明首先使用循环来转换字符串中的数组。

 $id_list; 

 foreach ($unique_user_id_list as $key => $value) {
                if($check == 1){
                    $id_list = 'FIELD ( Id'.',' . "'". $value. "'";
                    $check =2;
                }
                else{
                    $id_list = $id_list . "," . "'". $value. "'";
                }

            }
            $id_list = $id_list . ")";

上面的循环将生成"FIELD(id, '2', '3', '7', '13')"

完整查询我如何使用它如下。

$users = $this->Users->find('all',[
                    'contain' => [],
                    'conditions'=>['Id IN' => $unique_user_id_list],
                    'order'=> $id_list
                ]);

答案 1 :(得分:0)

尝试按如下方式格式化订单声明

->order(['users.Id'=>'ASC']);