Ларавел 5.7. Вычесть экземпляры модели

У меня есть 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() аккуратнее?

1

Решение

Метод diff должен работать по мере необходимости с новой коллекцией, содержащей только свойство name:

$comparableDiff = $diff->pluck('name');
$result = $full->diff($comparableDiff);
1

Другие решения

Трудно сказать, почему вы не хотите использовать 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"]
]
1

Я не нашел более аккуратный подход, чем

$profiles->reject(function ($profile) use ($existingProfiles) {
return $existingProfiles->pluck('name')->contains($profile->name);
})->values()

Но спасибо всем. Я проголосовал за ваши вопросы;)

0
По вопросам рекламы [email protected]