yii2 批量更新多个字段,更新条件不同 详细案例
时间: 2024-09-29 10:09:40 浏览: 51
Yii2组件之多图上传插件FileInput的详细使用教程
在Yii2框架中,批量更新多个字段并且每个记录的更新条件各不相同通常涉及到使用`ActiveRecord`的`updateAll()`或`updateAllCount()`方法,结合`condition`参数来指定不同的更新规则。这里有一个简单的示例:
```php
use Yii;
use app\models\ModelName; // 替换为你实际模型的名称
// 假设我们有一个用户表User,我们想根据用户ID批量更新用户名和状态
$usersToUpdate = [
['id' => 1, 'username' => 'new_username_1', 'status' => User::STATUS_ACTIVE], // 更新ID为1的用户
['id' => 2, 'username' => 'new_username_2', 'status' => User::STATUS_INACTIVE], // 更新ID为2的用户,设置状态为非活动
['id' => 3, 'username' => 'new_username_3'], // 只更新ID为3的用户的用户名,状态不做改变
];
// 使用updateAll()方法
ModelName::updateAll([
'username' => new Expression('CASE WHEN id IN (:ids) THEN :value ELSE username END'),
'status' => new Expression('CASE WHEN id IN (:ids) THEN :status ELSE status END'),
], [
':ids' => array_keys($usersToUpdate),
':value' => function ($id) use ($usersToUpdate) {
return $usersToUpdate[$id]['username'];
},
':status' => function ($id) use ($usersToUpdate) {
return $usersToUpdate[$id]['status'] ?: User::STATUS_DEFAULT;
}
]);
// 或者使用updateAllCount()方法,如果只关心操作成功条数
$count = ModelName::updateAllCount([
'username' => new Expression('CASE WHEN id IN (:ids) THEN :value ELSE username END'),
'status' => new Expression('CASE WHEN id IN (:ids) THEN :status ELSE status END'),
], [
':ids' => array_keys($usersToUpdate),
':value' => function ($id) use ($usersToUpdate) {
return $usersToUpdate[$id]['username'];
},
':status' => function ($id) use ($usersToUpdate) {
return $usersToUpdate[$id]['status'] ?: User::STATUS_DEFAULT;
}
]);
// 如果你想了解哪些记录更新了,可以查看受影响的行数或者获取具体的更新结果
if ($count > 0) {
echo "成功更新了 {$count} 条记录";
} else {
echo "没有符合条件的数据需要更新";
}
阅读全文