php

ThinkPHP中 inc和dec方法

2023-08-27

ThinkPHP6的inc和dec方法是老版本setInc和setDec的替代方法,用法和之前基本上一致,下面简单记录下用法:

1、inc方法将数字字段值增加,如:

public function update() {

    $result = M("User")->where('uid = 2')->inc('score', 3);

    if ($result !== false) {

        echo '数据更新成功!';

    } else {

        echo '没更新任何数据!';

    }

}

最终执行的SQL语句:

UPDATE user SET score=score+3 WHERE uid=2

inc方法中第一个参数为要修改的字段名称,后一个参数为数字字段增加的值,如果省略则默认增加1 。


2、dec方法将数字字段值减少,如:

public function update() {

    $result = M("User")->where('uid = 2')->dec('score', 3);

    if ($result !== false) {

        echo '数据更新成功!';

    } else {

        echo '没更新任何数据!';

    }

}

最终执行的SQL语句:

UPDATE user SET score=score-3 WHERE uid=2

dec方法中第一个参数为要修改的字段名称,后一个参数为数字字段减少的值,如果省略则默认减少1


inc与dec() 方法也支持连贯操作,从而可以构造更加复杂的更新条件。


3、举例

可以使用inc/dec方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)。

// score 字段加 1

Db::table('think_user')

    ->where('id', 1)

    ->inc('score')

    ->update();


// score 字段加 5

Db::table('think_user')

    ->where('id', 1)

    ->inc('score', 5)

    ->update();


// score 字段减 1

Db::table('think_user')

    ->where('id', 1)

    ->dec('score')

    ->update();


// score 字段减 5

Db::table('think_user')

    ->where('id', 1)

    ->dec('score', 5)

    ->update();


inc/dec方法可以多次调用更新多个字段,如果你每次只需要更新一个字段,也可以使用setInc/setDec方法。


// score 字段加 1

Db::table('think_user')

    ->where('id', 1)

    ->setInc('score');


// score 字段加 5

Db::table('think_user')

    ->where('id', 1)

    ->setInc('score', 5);


// score 字段减 1

Db::table('think_user')

    ->where('id', 1)

    ->setDec('score');


// score 字段减 5

Db::table('think_user')

    ->where('id', 1)

    ->setDec('score', 5);


最终生成的SQL语句可能是:


UPDATE `think_user`  SET `score` = `score` + 1  WHERE  `id` = 1 

UPDATE `think_user`  SET `score` = `score` + 5  WHERE  `id` = 1

UPDATE `think_user`  SET `score` = `score` - 1  WHERE  `id` = 1

UPDATE `think_user`  SET `score` = `score` - 5  WHERE  `id` = 1


4、延迟更新

对于数据表的统计字段,还提供了延迟更新方法,在setInc/setDec方法的第三个参数传入延迟更新的时间(秒)。


// 阅读统计字段延迟600秒写入

Db::table('think_blog')

    ->where('id', 1)

    ->setInc('read_count', 1, 600);


// 用户关注数延迟600秒写入

Db::table('think_user')

    ->where('id', 1)

    ->setInc('attention', 1, 600);