Запрос Active Record для обновления между двумя идентификаторами в YII2 без использования запроса строки - PullRequest
1 голос
/ 18 февраля 2020

Я нуб в YII2. Я ищу запрос на обновление с использованием Active Record в Yii2. Мне нужно обновить запись между двумя идентификаторами.

Запрос:

UPDATE
table_name
SET status_name = 1
WHERE
id BETWEEN 1 AND 10; 

Что я пробовал в Active Record:

$command = Yii::$app->db->createCommand('UPDATE table_name SET status_name = 1 WHERE id BETWEEN 1 AND 10 ');
$command->execute();

Но мне нужен запрос Activerecord без использования строки SQL запросов .

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Вы можете использовать метод stati c updateAll из Active Record:

TableName::updateAll(['status_name' => 1], 'id BETWEEN 1 AND 10');

или построитель запросов:

Yii::$app->db
    ->createCommand()
    ->update(
        'table_name',
        ['status_name' => 1],
        'id BETWEEN 1 AND 10'
    )
    ->execute();
1 голос
/ 19 февраля 2020

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

Обновление счетчиков Обычной задачей является увеличение или уменьшение столбца в таблице базы данных. Мы называем эти столбцы «встречными столбцами». Вы можете использовать updateCounters() для обновления одного или нескольких столбцов счетчика. Например,

$posts = TableName::find()->where(['between', 'id', "1", "10" ])->all();
$posts->updateCounters(['status_name' => 1]);

Примечание : если вы используете yii \ db \ ActiveRecord :: save () для обновления столбца счетчика, вы можете получить неточный результат, потому что, вероятно, один и тот же счетчик сохраняется несколькими запросами, которые читают и записывают одно и то же значение счетчика.

Обновление: Как упомянуто в комментариях для событий, таких как EVENT_AFTER_UPDATE для произойти Вы должны сделать что-то вроде этого:

$model = TableName::findOne()->where(['between', 'id', "1", "10" ])->all();
$model->status_name = new \yii\db\Expression('status_name + 1');
$model->save();

Эта проблема обсуждалась здесь: Событие EVENT_AFTER_UPDATE не происходит, когда updateCounters

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...