【问题标题】:Incrementing Cakephp database field by a value将 Cakephp 数据库字段增加一个值
【发布时间】:2012-01-31 03:09:03
【问题描述】:

我有这个字段,我必须将字段值增加一个特定值。 我正在使用这个

$data['quantity']     = 'Order.quantity+1';

对我不起作用的数量是这里的整数列。 当数据库中没有任何内容时它也可以工作吗?。

问候 希曼舒·夏尔马

【问题讨论】:

标签: cakephp cakephp-1.3


【解决方案1】:

我在代码中使用了 updateAll 来增加文章中的浏览量。因此,每次访问文章时,我都会在文章控制器的视图操作中调用以下函数:

function incrementViewCount($id) {
    $this->updateAll(
        array('Article.viewed' => 'Article.viewed+1'),                    
        array('Article.id' => $id)
    );
}

然后在你的控制器中……

$this->MyModel->incrementViewCount(123);

与上一个答案中建议的教程基本相似。

【讨论】:

  • 事实上这是无效的(至少它对我不起作用),我不得不这样做: return $this->updateAll( ["hits_count" => $this->query ()->newExpr("hits_count+1")], ["id IN" => $ids] );
【解决方案2】:

您可以为此使用 updateAll()

一点谷歌搜索很快就会发现这一点: http://cakephp.1045679.n5.nabble.com/Auto-Increment-A-Field-td3491697.html

【讨论】:

  • 恐怕这是不可能的,因为 updateAll 和 deleteAll 是唯一的原子方法,因此也是唯一可以使用这些字符串字段名称引用的方法。
  • 我必须更正我之前的评论:deleteAll() 在 CakePHP 2.x 中也不是原子的。只有 updateAll() 是。
【解决方案3】:

你也可以试试这个代码。适用于简单的 ++/-- 操作,无需额外查询。

https://gist.github.com/denchev/8209318

【讨论】:

    【解决方案4】:

    使用保存字段:

    <?php
    
    $this->Article->id = $id;
    $this->Article->saveField('viewed', (int)$this->Article->field('viewed') + 1);
    
    ?>
    

    【讨论】:

    • 这会产生更多的查询和需要 - 此外,如上所述的原子查询将始终正确递增......您的可能不会。
    • 是的,并不是说它是有效的。 :) 您能否将从字段调用返回的值转换为整数以确保增量? (用代码编辑)
    • 问题在于它是非原子的,因此另一个进程可以在这个递增的同时递增“已查看”字段。在此过程中丢失一个增量。
    猜你喜欢
    • 2011-02-15
    • 2011-11-04
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多