我正在使用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还是这个方法。
感谢。
答案 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--;
未经测试,可能会引发某种错误。