用Yii2的时候需要自增或自减某个字段的值,往往都是先find出来,然后增加,再save,操作了两次数据库,有点得不偿失。
网上百度了也没找到简单的实现方法,要么就是根本能用,然后就自己看源码,最后在 ActiveRecord 中找到了一个 updateAllCounters 方法
/**
* Updates the whole table using the provided counter changes and conditions.
* For example, to increment all customers' age by 1,
*
* ~~~
* Customer::updateAllCounters(['age' => 1]);
* ~~~
*
* @param array $counters the counters to be updated (attribute name => increment value).
* Use negative values if you want to decrement the counters.
* @param string|array $condition the conditions that will be put in the WHERE part of the UPDATE SQL.
* Please refer to [[Query::where()]] on how to specify this parameter.
* @param array $params the parameters (name => value) to be bound to the query.
* Do not name the parameters as `:bp0`, `:bp1`, etc., because they are used internally by this method.
* @return integer the number of rows updated
*/
public static function updateAllCounters($counters, $condition = '', $params = [])
{
$n = 0;
foreach ($counters as $name => $value) {
$counters[$name] = new Expression("[[$name]]+:bp{$n}", [":bp{$n}" => $value]);
$n++;
}
$command = static::getDb()->createCommand();
$command->update(static::tableName(), $counters, $condition, $params);
return $command->execute();
}使用很简单
User::updateAllCounters(['point' => 8],'id=1');
给用户id为1的用户增加8积分,若是要减少的话,设置为负数即可