laravel 忘记是没用的

s4chpxco  于 2023-06-25  发布在  其他
关注(0)|答案(4)|浏览(111)

如果我试图从这个集合中删除一个项目

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

通过做

$examples->forget(20);

它并没有从集合中删除该项目,我仍然会返回最初在集合中的所有项目。我已经阅读了Laravel文档和API文档。它应该工作(我认为),但它没有。
有人能指出我在这里做错了什么吗?
这仍然返回一个对象。

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

P.S.任何其他方法,如push or get都有效。
非常感谢!

gwbalxhn

gwbalxhn1#

你犯了一个小错误,其实你没有注意到。我自己做的:)。
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`
yzxexxkh

yzxexxkh2#

根据文档,它说forget()通过密钥工作。单词“key”是模糊的,因为他们的意思是说数组键也称为“index”,而不是模型键,即id。
然而,在其他方法中,如find()contains(),它们使用单词“key”表示模型键,因此您可以看到混淆。
查看源代码时,可以看到forget()方法位于Illuminate\Support\Collection类中,而不在Illuminate\Database\Eloquent\Collection中。
我的理论是,支持类应该更通用,所以它不考虑模型键,但真的我不知道。

gupuwyp2

gupuwyp23#

我只是想补充一下阿南的答案。一旦你有了一个集合,你就可以像这样循环通过它来按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);
nkcskrwz

nkcskrwz4#

你能做的

$examples->reject(20);

与大多数其他集合方法一样,reject返回一个新的集合示例;它不修改调用它的集合。

相关问题