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]);