2015-02-21 2 views
3

У меня есть следующий необработанный SQL-запрос:Yii2 QueryBuilder Обновление с Присоединяйтесь

UPDATE `pay_audit` 
JOIN `invoice_items` 
ON `invoice_items`.`mdn` = `pay_audit`.`account_id` 
AND `invoice_items`.`unitprice` = `pay_audit`.`payment` 
AND `invoice_items`.`producttype_name` LIKE 'PAYMENT' 
AND DATE_FORMAT(`invoice_items`.`created`, '%Y-%m-%d') = '2015-02-21' 
SET `pay_audit`.`invoice_item_id` = `invoice_items`.`id` 
WHERE `pay_audit`.`report_date` = '2015-02-21' 

дата является переменной датой $ в PHP.

Как я могу «преобразовать» этот необработанный SQL-запрос в Yii2 QueryBuilder?

[UPDATE]

Как Фелипе упоминалось, что это не возможно с построитель запросов, так что я в конечном итоге делает это, как последовало:

$today = date('Y-m-d'); 
    $sql = ""; 
    $sql .= "UPDATE `pay_audit` "; 
    $sql .= "JOIN `invoice_items` "; 
    $sql .= "ON `invoice_items`.`mdn` = `pay_audit`.`account_id` "; 
    $sql .= "AND `invoice_items`.`unitprice` = `qpay_audit`.`payment` "; 
    $sql .= "AND `invoice_items`.`producttype_name` LIKE 'PAYMENT' "; 
    $sql .= "AND DATE_FORMAT(`invoice_items`.`created`, '%Y-%m-%d') = '$today' "; 
    $sql .= "SET `pay_audit`.`invoice_item_id` = `invoice_items`.`id` "; 
    $sql .= "WHERE `pay_audit`.`report_date` = '$today'"; 

    $command = \Yii::$app->db->createCommand($sql); 
    $command->execute(); 

ответ

1

Боюсь Yii 2 Query Builder для запросов на выборку только.

Для обновления запросов у вас есть по крайней мере три варианта:

  • Сырье SQL:

    \Yii::$app->db->createCommand('update user set status = 1 where age > 30')->execute(); 
    
  • Сырье SQL с заполнители (для предотвращения инъекций SQL)

    \Yii::$app->db->createCommand('update user set status = :status where age > 30')->bindValue(':status','1')->execute(); 
    
  • метод update()

    // update user set status = 1 where age > 30 
    \Yii::$app->db->createCommand()->update('user', ['status' => 1], 'age > 30')->execute(); 
    

Больше информации здесь:

Смежные вопросы