我有2个模型集合。
例如
$full = collect([
[
'name' => 'name1', //id was omitted intentionally
],
[
'name' => 'name2', //id was omitted intentionally
],
[
'name' => 'name3', //id was omitted intentionally
],
]);
$diff = collect([
[
'id' => 6,
'name' => 'name1',
],
]);
我希望在这样的事情后得到这样的结果
$full->diff($full);
$result = [
[
'name' => 'name2',
],
[
'name' => 'name3',
],
];
如何在没有filter()
或reject()
和contains()
的情况下以更整洁的方式实现这一目标?
diff方法应该根据需要使用只包含name属性的新集合:
$comparableDiff = $diff->pluck('name');
$result = $full->diff($comparableDiff);
很难说为什么你不想在filter
上使用reject
或contains
,但还有另一种解决方案:
$result = $full->pluck('name')->diff($diff->pluck('name'))->map(function($name) {
return [
'name' => $name
];
});
dd($result->toArray());
结果你会得到:
array:2 [▼
1 => array:1 [▼
"name" => "name2"
]
2 => array:1 [▼
"name" => "name3"
]
]
我还没有找到一种更简洁的方法
$profiles->reject(function ($profile) use ($existingProfiles) {
return $existingProfiles->pluck('name')->contains($profile->name);
})->values()
但感谢大家。我提出了你的问题;)