关于Yii2中更新数据

技术分享 · Fecmall · 于 6年前 发布 · 15286 次阅读

Yii2中,ActiveRecord是有updateAll函数

CustomerMySqlModel:我们已经定义好了的一个mysql的ActiveRecord

1.赋值更新:

CustomerMySqlModel::updateAll(['status' => 1], ['status' => 2]);

将status = 1 的所有数据的status更新为2

2.自增更新(mysqldb):

用于数字类型,将值进行 累加 或者 累减

use yii\db\Expression;

...

$deduct_balance = 1;

$effect = CustomerMySqlModel::updateAll(
	[
		'account_balance' => new Expression('account_balance-' . $deduct_balance),
	],
	[
		'and', ['id' => $customer_id], ['>=', '`account_balance` + `account_balance_overdraft`', $deduct_balance],//条件为当前用户可用余额
大于被扣的金额
	]
);

第一个参数数组:将 account_balance 累减 1

第二个参数数组:查询条件。

也就是将满足查询条件的数据进行累减1

3.另外一种进行累加的方式

$effect = CustomerModel::updateAllCounters(
	['account_balance' => $amount], ['id' => $customer_id]
);
if (empty($effect)) {
	return false;
}

如果 $amount = 1,那么就是累加1,如果 $amount = -1 , 那么就是累减1

4.只允许更新一次

对于有一些需求,譬如更改订单状态,然后扣除积分,我们只允许更新一次,不能多次更新,因此我们给表加一个字段ver,设置默认值为0

$effect = MyOrder::updateAll(//更新订单,带上条件,条件相当于乐观锁
            [
                'ver' => new Expression('ver + 1'),
                'order_status' => Yii::$service->order->payment_status_processing,
            ],
            [
                'and' , ['increment_id' => $increment_id] , ['and' , ['<','ver' , 1] , ['!=','order_status',Yii::$service->order->payment_status_processing]],
            ]
        );

        if (empty($effect)) {//无影响行数 ,说明更新过,或没订单号
            Yii::$service->helper->errors->add('Order not exist OR Your order has been paid');
            return false;
        }

5.Mongodb Active Record 更新 - 累加:

Product::updateAll(['$inc' => ['favorite_count' => 1]],['_id' => $product_id]);

累减:

Product::updateAll(['$inc' => ['favorite_count' => -1]],['_id' => $product_id]);
共收到 0 条回复
没有找到数据。
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics