выполнение необработанного запроса в построителе запросов в yii2 - PullRequest
0 голосов
/ 20 марта 2020

Как мне преобразовать этот необработанный запрос в построитель запросов yii2, когда я получаю запись с помощью подзапроса:

RAW QUERY :

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');

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Попробуйте следующий код:

$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])
    ;
0 голосов
/ 20 марта 2020

Вы можете использовать функцию 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();

Поместите ваш необработанный запрос в функцию createCommand(). Здесь я использовал $search переменную, как вы использовали в своем подзапросе

...