在 Yii 2.0 上,使用 updateAll() 更新表列值为同一表的另一列值的实现
1、使用 updateAll() 更新 prev_status 的值为 status 的值,更新 status 的值为 4,表结构如图1
2、基于查询构建器,代码如下
1 | self::updateAll([ 'prev_status' => 'status' , 'status' => self::PLAN_TASK_STATUS_CLOSE], [ 'in' , 'plan_id' , $planId ]); |
3、但是并未符合预期,prev_status 的值皆用 0 进行更新,最终生成的 SQL 语句如下
1 | UPDATE `pa_plan_task` SET `prev_status`=0, `status`=4 WHERE `plan_id` IN (1, 2) |
4、基于 yii\db\Expression,表示不需要转义或引用的DB表达式,代码如下
1 2 3 | use yii\db\Expression; self::updateAll([ 'prev_status' => new Expression( 'status' ), 'status' => self::PLAN_TASK_STATUS_CLOSE], [ 'in' , 'plan_id' , $planId ]); |
5、结果符合预期,最终生成的 SQL 语句如下
1 | UPDATE `pa_plan_task` SET `prev_status`=status, `status`=4 WHERE `plan_id` IN (1, 2) |
6、操作结果符合预期,如图2
近期评论