mysql - 将 MySql 查询转换为 Cakephp 2.6

标签 mysql cakephp cakephp-2.6

你好 friend 我是 Cakephp 2.6 的新手,我需要将 MySql 查询转换为 Cakephp 2.6。我得到了所需的输出,我正在按任务 ID 获取客户和顾问组之间的最后一次对话。我不想编写 Model:query(),因为我也需要 cakephp 的默认分页。

这是我的下表,请看

enter image description here

SELECT * FROM (SELECT task_id, MAX(created) AS created FROM task_conversations GROUP BY task_id) AS x 
JOIN task_conversations USING (task_id, created) 
WHERE (client_id=3 OR consultant_id= 3) ORDER BY modified ASC

这是上述查询的以下输出:

enter image description here

我正在尝试通过编写以下代码行来解决它

$this->paginate = array(
            'conditions' => array(
                'TaskConversation.sender_id'    => $consultant['User']['id'],
                'Task.status'                       => 1
            ),
            'group'         => 'TaskConversation.task_id',
            'limit'         => 3,
            'order'         => array('TaskConversation.conversation'=> 'ASC'
            ),
            'recursive'     => 2
        );
        $this->set('tasks', $this->Paginator->paginate());

我在这里也需要分页。请让我知道您的反馈。提前致谢

最佳答案

终于找到了解决办法。这是解决方案:

我在模型中添加了自定义分页功能。这是代码:

public function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = []) {    


     if(isset($extra['isCustomPagination']) && $extra['isCustomPagination']==0) {
                $recursive = -1;

    return $this->find(
        'all',
        compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive')
    );
            }else{
                $recursive = -1;
        // Mandatory to have
        $this->useTable = false;
        $sql = '';
        $sql .= "(SELECT * FROM (SELECT task_id, MAX(created) AS created FROM task_conversations GROUP BY task_id) AS Task JOIN task_conversations as TaskConversation USING (task_id, created) INNER JOIN tasks as Task2 ON Task2.id=Task.task_id INNER JOIN users as Client ON TaskConversation.client_id=Client.id INNER JOIN users AS Consultant ON TaskConversation.consultant_id = Consultant.id where (TaskConversation.consultant_id = ".$extra['extra']['consultant_id'].") order by TaskConversation.modified ASC) ";

        // Adding LIMIT Clause
        $sql .= ' LIMIT '.(($page - 1) * $limit) . ', ' . $limit;
        $results = $this->query($sql);
        return $results;
            }
    }

    public function paginateCount($conditions = null, $recursive = 0, $extra = array()) {

      if(isset($extra['isCustomPagination']) && $extra['isCustomPagination']==0) {

                    $parameters = compact('conditions');
      if ($recursive != $this->recursive) {
    $parameters['recursive'] = $recursive;
   }
   $count = $this->find('count', array_merge($parameters, $extra));
   return $count;
             }
             else {
                 $sql = '';
        $sql .= "(SELECT * FROM (SELECT task_id, MAX(created) AS created FROM task_conversations GROUP BY task_id) AS Task JOIN task_conversations as TaskConversation USING (task_id, created) INNER JOIN tasks as Task2 ON Task2.id=Task.task_id INNER JOIN users as Client ON TaskConversation.client_id=Client.id INNER JOIN users AS Consultant ON TaskConversation.consultant_id = Consultant.id where (TaskConversation.consultant_id = ".$extra['extra']['consultant_id'].") order by TaskConversation.modified ASC) ";
        $this->recursive = $recursive;
        $results = $this->query($sql);
        return count($results);
             }
    }

在 Controller 中我添加了以下几行:

$this->paginate = array('TaskConversation'=>array('limit'=>2,'extra'=>array('client_id'=>$consultant['User']['id'],'consultant_id'=>$consultant['User']['id'])));

如果您不想在与同一模型相关的其他功能中使用自定义分页,那么我已将其传递给 paginate 'isCustomPagination' => 0。

$this->TaskConversation->contain('Task','Client','Consultant');
         $this->paginate = array(
            'conditions' => array(
                'TaskConversation.task_id'  => $id,
                'Task.status'               => 1
            ),
            'order'         => array('TaskConversation.created'=> 'ASC'
            ),
            'recursive'     => 2,
            'isCustomPagination' => 0,
         );
        $this->set('conversations', $this->Paginator->paginate());

关于mysql - 将 MySql 查询转换为 Cakephp 2.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40146960/

相关文章:

php - Mysql查询,item包含所有指定的标签

forms - 用于验证表单发布数据的 CakePHP 安全组件 token 不同 -> 黑洞

php - 在 Apache 中接收 404 错误 - 生产中的 Cakephp 3 后端

mysql - 随机播放数据库 ID

mysql - 以IN子查询的顺序对查询结果进行排序

mysql - hasMany加入cakephp错误

mysql - cakephp 带有子查询和 if 的虚拟字段

Session->flash 在 CakePHP 中不显示 session 消息

css - CakePHP 2.6.0 不加载 CSS 和 JS 文件

MySQL 按邮政编码分组