在 Yii 2.0 上,使用 updateAll() 更新表列值为同一表的另一列值的实现

1、使用 updateAll() 更新 prev_status 的值为 status 的值,更新 status 的值为 4,表结构如图1

使用 updateAll() 更新 prev_status 的值为 status 的值,更新 status 的值为 4,表结构

图1

2、基于查询构建器,代码如下

self::updateAll(['prev_status' => 'status', 'status' => self::PLAN_TASK_STATUS_CLOSE], ['in', 'plan_id', $planId]);

3、但是并未符合预期,prev_status 的值皆用 0 进行更新,最终生成的 SQL 语句如下

UPDATE `pa_plan_task` SET `prev_status`=0, `status`=4 WHERE `plan_id` IN (1, 2)

4、基于 yii/db/Expression,表示不需要转义或引用的DB表达式,代码如下

use yii/db/Expression;

self::updateAll(['prev_status' => new Expression('status'), 'status' => self::PLAN_TASK_STATUS_CLOSE], ['in', 'plan_id', $planId]);

5、结果符合预期,最终生成的 SQL 语句如下

UPDATE `pa_plan_task` SET `prev_status`=status, `status`=4 WHERE `plan_id` IN (1, 2)

6、操作结果符合预期,如图2

操作结果符合预期

图2

原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/181135.html

(0)
上一篇 2021年10月31日
下一篇 2021年10月31日

相关推荐

发表回复

登录后才能评论