在yii2中将原始查询执行到查询构建器中>>

问题描述 投票:0回答:2

当我使用子查询获取记录时,如何将该原始查询转换为查询生成器yii2:>

原始查询

SELECT *
FROM (
    SELECT DISTINCT `comp`.*,TIMESTAMPDIFF(HOUR,comp.created_date,comp.updated_date) 
    AS hours
    FROM `complaints` `comp`
    INNER JOIN `complaint_log` `comp_log` ON comp_log.`comp_id` = comp.`id`
    WHERE ((comp.name LIKE '%%' OR comp.id LIKE '%%' OR comp.phone_no LIKE '%%') 
    AND DATE(comp.created_date) 
    BETWEEN '2018-01-01' AND '2020-03-20') 
    AND (comp.is_delete = 0)
    ORDER BY `comp`.`id` DESC, `comp`.`created_date` DESC)
    AS cte_name WHERE hours > 120;

Yii2查询

$query = (new \yii\db\Query())
       ->select('comp.*')
       ->from('complaints comp
       ->distinct()
       ->innerJoin('complaint_log as comp_log', 'comp_log.`comp_id` =comp.`id`')
       ->where($search)
       ->andWhere('comp.is_delete = 0')
       ->orderBy("comp.id DESC")
       ->addOrderBy('comp.created_date DESC');

当我使用子查询获取记录时,如何将此原始查询转换为查询生成器yii2:原始查询:SELECT * FROM(SELECT DISTINCT`comp。*,TIMESTAMPDIFF(HOUR,comp.created_date,...

php mysql yii yii2 yii2-advanced-app
2个回答
0
投票

您可以使用createCommand()功能:使用以下查询。

$connection = \Yii::$app->db;
$query = $connection->createCommand(
'
  SELECT * FROM (
    SELECT DISTINCT comp.*,TIMESTAMPDIFF(HOUR,comp.created_date,comp.updated_date) AS hours
    FROM complaints comp
    INNER JOIN complaint_log comp_log ON comp_log.comp_id = comp.id
    WHERE ('.$search.')
    AND (comp.is_delete = 0)
    ORDER BY comp.id DESC, comp.created_date DESC
  ) AS cte_name WHERE hours > 120;
');
$data = $query->queryAll();

0
投票

尝试以下代码:

$subquery =  (new \yii\db\Query())
        ->select(['comp.*', 'TIMESTAMPDIFF(HOUR, comp.created_date, comp.updated_date) AS hours'])
        ->distinct()
        ->from('complaints comp')
        ->innerJoin('complaint_log comp_log', 'comp_log.comp_id = comp.id')
        ->where(['or',
            ['like', 'comp.name', $search_name],
            ['or',
                ['like', 'comp.id', $search_id],
                ['like', 'comp.phone_no', $search_phone],
            ]
        ])
        ->andWhere('DATE(comp.created_date) BETWEEN :cStart AND :cEnd', [':cStart' => '2018-01-01', ':cEnd' => '2020-03-20'])
        ->andWhere(['comp.is_delete' => 0])
        ->orderBy(['comp.id' => SORT_DESC, 'comp.created_date' => SORT_DESC])
    ;
    $query = (new \yii\db\Query())
        ->select('cte_name.*')
        ->from(['cte_name' => $subquery])
        ->where(['>', 'cte_name.hours', 120])
    ;
© www.soinside.com 2019 - 2024. All rights reserved.