Active Record 查询 YII2 中两个 id 之间的更新而不使用行查询
Active Record query for update between two ids in YII2 without using row query
我是YII2的菜鸟。
我正在 Yii2 中使用 Active Record 搜索更新查询。
我需要更新一些介于两个 ID 之间的记录。
查询:
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 查询.
您可以使用 Active Record 中的静态 updateAll
方法:
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();
就像提到的问题的另一个解决方案一样,您可以使用更新计数器:
更新计数器
递增或递减数据库中的列是一项常见任务 table。我们称这些列为 "counter columns"。您可以使用 updateCounters()
来更新一个或多个计数器列。例如,
$posts = TableName::find()->where(['between', 'id', "1", "10" ])->all();
$posts->updateCounters(['status_name' => 1]);
Note: If you use yii\db\ActiveRecord::save() to update a counter
column, you may end up with inaccurate result, because it is likely
the same counter is being saved by multiple requests which read and
write the same counter value.
更新:
就像评论中提到的事件 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 EVENT_AFTER_UPDATE does not occur when updateCounters
我是YII2的菜鸟。 我正在 Yii2 中使用 Active Record 搜索更新查询。 我需要更新一些介于两个 ID 之间的记录。
查询:
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 查询.
您可以使用 Active Record 中的静态 updateAll
方法:
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();
就像提到的问题的另一个解决方案一样,您可以使用更新计数器:
更新计数器
递增或递减数据库中的列是一项常见任务 table。我们称这些列为 "counter columns"。您可以使用 updateCounters()
来更新一个或多个计数器列。例如,
$posts = TableName::find()->where(['between', 'id', "1", "10" ])->all();
$posts->updateCounters(['status_name' => 1]);
Note: If you use yii\db\ActiveRecord::save() to update a counter column, you may end up with inaccurate result, because it is likely the same counter is being saved by multiple requests which read and write the same counter value.
更新:
就像评论中提到的事件 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 EVENT_AFTER_UPDATE does not occur when updateCounters