Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在cakephp中运行子查询_Php_Mysql_Cakephp - Fatal编程技术网

如何在cakephp中运行子查询

如何在cakephp中运行子查询,php,mysql,cakephp,Php,Mysql,Cakephp,CakePHP2.6 我有一个叫Temps的模型,它有很多票。在temp的索引视图中,我想为每条记录返回日期最接近当前日期的记录单 在mySQL中,它可以按如下方式完成 'SELECT expiry_date FROM uploads WHERE expiry_date > CURDATE() ORDER BY expiry_date ASC LIMIT 1' 但我不知道如何将其作为子查询运行。我当前用于生成结果的查询如下:(请记住,这是为datatables配置的)票证是上载模型的别名

CakePHP2.6

我有一个叫Temps的模型,它有很多票。在temp的索引视图中,我想为每条记录返回日期最接近当前日期的记录单

在mySQL中,它可以按如下方式完成

'SELECT expiry_date FROM uploads WHERE expiry_date > CURDATE() ORDER BY expiry_date ASC LIMIT 1'
但我不知道如何将其作为子查询运行。我当前用于生成结果的查询如下:(请记住,这是为datatables配置的)票证是上载模型的别名

 public function getAjaxIndexData($data) {
            $tokens = explode(" ", $data['searchString']);
            $conditions = array(
                $this->alias . '.deleted' => false,
                'OR' => array(
                    'CONCAT(' . $this->alias . '.first_name," ",' . $this->alias . '.last_name) LIKE' => '%' . implode(' ', $tokens) . '%',
                ),
                $data['columnsFilter']
            );
            $fields = array(
                'id',
                'full_name',
                'pps_number',
                'mobile',
                'email',
                'start_date',
                'time_served'
            );
            $order = array(
                $data['orderField'] => $data['order'] 
            );
            $contain = array(
                'LocalOffice.name',
            );

            $options = array(
                'conditions' => $conditions,
                'fields' => $fields,
                'order' => $order,
                'contain' => $contain,
                'limit' => $data['limit'],
                'offset' => $data['start']
            );
            $optionsNoFields = array(
                'conditions' => $conditions,
                'contain' => $contain,
            );

            $result['draw'] = $data['draw']; 
            $result['recordsTotal'] = $recordTotal = $this->find('count');
            $result['recordsFiltered'] = $this->find('count', $optionsNoFields); 
            $result['data'] = $this->find('all', $options); //standard search
            $result['data'] = $this->formatTable($result['data']); 

            return json_encode($result);
        }
在这个查询中,我想添加一个字段,显示每个临时工最近的到期日期


如何构造此字段?

动态创建虚拟字段:

$this->virtualFields['nearest'] = '(SELECT expiry_date FROM uploads WHERE expiry_date > CURDATE() AND uploads.owner_id = '.$this->alias.'.ticket_id  ORDER BY expiry_date ASC LIMIT 1')';
然后调整字段数组

        $fields = array(
            'id',
            'full_name',
            'pps_number',
            'mobile',
            'email',
            'start_date',
            'time_served',
            'nearest'
        );

此外,查询可以重写为(“temp”需要替换为模型别名)

这意味着一个性能可能更好的查询是将该子查询从SELECT语句的列中移到联接中。例如:

SELECT * 
FROM temp
LEFT JOIN (SELECT MIN(expiry_date) AS expiry,owner_id
    FROM uploads 
    WHERE expiry_date > CURDATE())
    GROUP BY owner_id) AS next_dates
  ON next_dates.owner_id = temp.ticket_id;

看看这个虚拟字段方法,它为每个结果返回的值与它从数据库中选择all相同。我可以添加uploads.owner_id(FK)=temp.ticket这样的条件吗_id@mcgowan.b-我更改了代码以匹配您的新信息
SELECT * 
FROM temp
LEFT JOIN (SELECT MIN(expiry_date) AS expiry,owner_id
    FROM uploads 
    WHERE expiry_date > CURDATE())
    GROUP BY owner_id) AS next_dates
  ON next_dates.owner_id = temp.ticket_id;