递减函数,递减表中的所有行

时间:2013-01-08 20:20:57

标签: php laravel laravel-3

我正在使用laravel v3.2.12-4,我的减量功能有问题。此方法不会仅更新一行,而是会影响列中的所有行。我使用Eloquent,我有很多关系。

构成递减方法的代码是:

 foreach ($ids as $id) {
 $indicator = Indicator::find($id);
 $tags = $indicator->tags()->get();
 foreach ($tags as $tag) {

    $indicator->tags()->detach($tag->id);
    if ($tag->frequency == 1) {
        $tag->delete();
    } else {
        // I have to made  this code to fix the problem with decrement function
        // But i want to use decrement
        $tag->frequency = $tag->frequency - 1;
        $tag->save();

        // This dosnt work for me.
        // $tag->decrement('frequency');
    }
}

$indicator->delete();

}

在模型类Indicator中我与这个函数建立了关系:

public function tags()
{
    return $this->has_many_and_belongs_to('Tag');
}

在模型类中,Tag i与此函数建立了关系:

public function indicators()
{
    return $this->has_many_and_belongs_to('Indicator');
}

好吧,如果我对列进行了更新,这个结果对我来说没问题,但是当我使用减量函数时,这会影响所有行,我不知道这是一个bug还是这个方法。

感谢。

1 个答案:

答案 0 :(得分:0)

这就是它的设计方式。 decrement()方法实际上是defined on the Query Builder,而不是Eloquents构建器。这意味着,当您致电$tag->decrement('frequency')时,它实际上会落入QB并只是运行UPDATE tag SET frequency=frequency - 1之类的查询。请注意,没有WHERE子句?

您仍然可以使用decrement()方法,但您必须这样做。

$tag->where_id($tag->id)->decrement('frequency');

现在您已经设置了WHERE子句,并且只会减少该标记。当然,更清洁的解决方案就是你所拥有的。或许这个。

$tag->frequency--;

未经测试,可能会引发某种错误。