忘记不起作用

时间:2013-12-22 23:28:00

标签: collections laravel

如果我尝试从此集合中删除某个项目

$examples = Example::where('example', '=', $data['example'])->get();

$examples->forget(20);

它不会从集合中删除该项目,我仍然可以取回原来在那里的所有项目。我已经阅读了Laravel文档和api文档。它应该工作(我认为),但事实并非如此。

有人能指出我在这里做错了吗?

这仍然会返回一个对象。

$examples->forget(49);
return $examples->find(49);

P.S。像push或get这样的其他方法。

非常感谢!

4 个答案:

答案 0 :(得分:5)

你犯了一个小错误,实际上你没注意到。我做了自己:)。

Forget使用array key从集合中删除对象项。

Array(0 => 'abc'
 1 => 'bcd'
 49 => 'aaa'
)

$examples->forget(49);
                  ^^ array key 49

其中,find使用id从集合中查找对象

table: examples

id example
1   abc
49  bce

$examples->find(49);
                ^^ `example id`

答案 1 :(得分:1)

我只想补充Anam的答案。一旦你有了一个集合,你就可以像这样循环它以按ID删除

function forgetById($collection,$id){
    foreach($collection as $key => $item){
        if($item->id == $id){
            $collection->forget($key);
            break;
        }
    }
    return $collection;
}

$examples = Example::where('example', '=', $data['example'])->get();

$examples = forgetById($examples,20);

答案 2 :(得分:0)

根据文档,它说forget()按键工作。单词" key "是不明确的,因为它们的意思是数组键也称为" index "而不是模型键,即id。

但是,在其他方法中,例如find()contains(),他们会使用" key "意思是模型键,这样你就可以看到混乱。

当您查看来源时,您会发现在forget()课程中找到了Illuminate\Support\Collection方法,而在Illuminate\Database\Eloquent\Collection中找不到{{1}}方法。

我的理论是,支持类应该更通用,因此它不会考虑模型键,但我真的不知道。

答案 3 :(得分:0)

您可以做到

$examples->reject(20);

与大多数其他收集方法一样,拒绝返回新的收集实例;它不会修改调用的集合。