Laravel 5.7。减去模型实例

问题描述 投票:1回答:3

我有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()的情况下以更整洁的方式实现这一目标?

php laravel laravel-5 laravel-collection laravel-5.7
3个回答
1
投票

diff方法应该根据需要使用只包含name属性的新集合:

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

1
投票

很难说为什么你不想在filter上使用rejectcontains,但还有另一种解决方案:

$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"
  ]
]

0
投票

我还没有找到一种更简洁的方法

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

但感谢大家。我提出了你的问题;)

© www.soinside.com 2019 - 2024. All rights reserved.