У меня есть 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()
Но спасибо всем. Я проголосовал за ваши вопросы;)