[英]Filter laravel collection in sub collection
我的收藏是這樣的。
Collection {
0 => Name_Model {
"id" => 44
"name" => "The name of "
"list_angg" => Collection {
0 => Name_Model_sub {
"code" => "02"
"nameofcode" => "The name of 02"
}
1 => Name_Model_sub {
"code" => "01"
"nameofcode" => "The name of 01"
}
}
}
1 => Name_Model {
"id" => 45
"name" => "The name of thus"
"list_angg" => Collection {
0 => Name_Model_sub {
"code" => "03"
"nameofcode" => "The name of 3"
}
}
}
}
我想通過list_angg->code
的值過濾 model 。 所以我嘗試這樣。 過濾並 foreach list_angg->code
$jurnals = $filterCollection->filter(function($value, $key) use ($kode_fakultas){
foreach ($value->list_angg as $lists) {
$filtered = $lists->where('code', $kode_fakultas);
return $filtered;
}
return $filtered;
});
dd($jurnals);
我嘗試使用方法reject()
和map()
。 但是過濾器也不起作用。 我錯過了什么嗎?
您可以通過首先根據您的要求重組集合來做到這一點。 例如:
public function formatCollection($collection)
{
$results = [];
foreach ($collection as $item)
{
$results[] = [
'foe' => $item['bar'],
'baz' => $item['foo']
];
}
return collect($results);
}
這將返回所需的 json 格式,之后您可以對其應用過濾器。 例如:
$result = formatCollection($collection);
這將返回您可以應用的集合
$result->filter(function(value){
return (value === 'foo');
}
這將返回集合中所需的信息或模型。
希望我正確理解了這個問題。
要過濾list_angg->code
具有給定值的所有元素,您可以使用filter()
和contains()
的組合。
$filterCollection->filter(function ($value) use ($code) {
return $value->list_angg->contains('code', $code);
});
filter()
返回集合中所有返回真值的值。
如果集合包含與提供的條件匹配的值(可以是閉包、值或鍵和值),則contains()
返回true
或false
。
請記住contains()
使用“松散”比較,因此如果您需要嚴格匹配,可以使用containsStrict
。
您的代碼未正確過濾,因為在過濾器閉包中您始終返回 model 實例,該實例根據第一個元素評估為true
或false
,因此基於此將其視為通過或失敗。
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.