如果我尝试从此集合中删除某个项目
$examples = Example::where('example', '=', $data['example'])->get();
做
$examples->forget(20);
它不会从集合中删除该项目,我仍然可以取回原来在那里的所有项目。我已经阅读了Laravel文档和api文档。它应该工作(我认为),但事实并非如此。
有人能指出我在这里做错了吗?
这仍然会返回一个对象。
$examples->forget(49);
return $examples->find(49);
P.S。像push或get这样的其他方法。
非常感谢!
答案 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);
与大多数其他收集方法一样,拒绝返回新的收集实例;它不会修改调用的集合。