Laravel Eloquent 集合如果存在于数组中则从集合中删除项目

Laravel Eloquent Collection remove item from Collection if exist in array

我今天遇到了一个简单的问题。我在 Livewire Component 中工作,我有一个对象集合,当我单击一个对象时,我想将它添加到一个数组(有效),然后想从集合中删除它 - 所以该对象不是可以点击了。 我有:

public function addPartToUsage($partId){
    $partToAdd = Part::where('id', '=', $partId)->first();

    $this->verwendung[] = ['id'=> $partToAdd->id, 'partBezeichnung'=>$partToAdd->id.':'.$partToAdd->zeichnungsnummer.' - '.$partToAdd->artikelbezeichnung];

    $this->partsClient = Part::where('artikelbezeichnung', 'LIKE', '%' . $this->inputsearchpart . '%')
        ->orWhere('zeichnungsnummer', 'LIKE', '%' . $this->inputsearchpart . '%')
        ->orderBy('artikelnummer')
        ->get();



    foreach ($this->verwendung as $item) {

        if($this->partsClient->contains('id', $item['id'])){
          
           $this->partsClient->forget($this->partsClient->where('id', $item['id'])->id);
        }  }  }

但它不起作用,因为我不知道包含匹配 ID 的元素的键。

$this->verwendung 是我的数组,它保存 $this->verwendung[0]['id'] 中的 id 和 $this->partsClient 是我从数据库中收集的。

如何修改集合而不将其放入数组,然后检查匹配的 ID,然后重新收集? 或者更好的方法是如何检索集合的匹配键,以便我可以使用 forget() ? 感谢这里的所有人!

无需检查id是否包含在集合中,您可以直接使用reject()过滤它

foreach ($this->verwendung as $item) {
    $this->partsClient->reject(function ($value, $key) use ($item) {
        return $value->id == $item['id'];
    });
}

或者干脆

$verwendungCollection = collect($this->verwendung);

$idsToRemove = $verwendungCollection->pluck('id')->toArray();

$this->partsClient->reject(function ($value, $key) use ($item) {
    return in_array($value->id, $idsToRemove);
});