YII 批量更新 多个属性不同值

背景:当然是提高程序性能,缩短执行时间。

批量更新同一属性为相同的值,这个就没什么好讨论的,不会的,自行百度或者Google。

1、第一种方法首先想到是用MySQL 的case when 组装一个SQL,然后执行

a、更新其中一个属性时,SQL如下:

UPDATE test_user 
    SET t_name = CASE t_id 
        WHEN 1 THEN '张三' 
        WHEN 2 THEN '王五' 
        WHEN 3 THEN '李四'
    END
WHERE t_id IN (1,2,3)

b、更新其中两个属性是,SQL如下:

UPDATE test_user 
    SET t_name = CASE t_id 
        WHEN 1 THEN '张三' 
        WHEN 2 THEN '王五' 
        WHEN 3 THEN '李四'
    END,
	t_gender = CASE t_id
	    WHEN 1 THEN 0 
        WHEN 2 THEN 1 
        WHEN 3 THEN 1
	END
WHERE t_id IN (1,2,3)

更新更多属性以此类推,就不一一举例了。

注意:MySQL5.6及以下,在用case when 更新属性的值json格式,中文貌似有问题。MySQL5.7及以上,可以用json_object来解决这个问题。

2、拼凑SQL更新法,直接上菜

$tbName = 'test_user';
$updateTime = time();
$sqlArr = [];
$sqlArr[] = \Yii::$app->db->createCommand()->update($tbName,['t_name' => '张三','t_update_time' => $updateTime],['t_id' => 1])->getRawSql();
$sqlArr[] = \Yii::$app->db->createCommand()->update($tbName,['t_name' => '王五','t_update_time' => $updateTime],['t_id' => 2])->getRawSql();
$sqlArr[] = \Yii::$app->db->createCommand()->update($tbName,['t_name' => '李四','t_update_time' => $updateTime],['t_id' => 3])->getRawSql();
$sql = implode(";\n", $sqlArr) . ';';
\Yii::$app->db->createCommand($sql)->execute();

拼凑SQL的循环根据自己的实际情况进行组装。

3、用replace into  或者 insert into on duplicate key update来实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值