Встроено для этого $collection->intersect($other)
, но вы также можете достичь желаемого результата с помощью простого пользовательского фильтра:
$left = collect([Model::find(1), Model::find(2), Model::find(3)]);
$right = collect([Model::find(1), Model::find(3), Model::find(5)]);
$result = $left->filter(function ($value, $key) use ($right) {
return $right->contains(function ($v, $k) use ($value) {
return $v->id === $value->id;
});
});
Будет выполнено сравнение моделей на id
. Это не очень производительный, хотя. Другой подход состоит в том, чтобы получить два массива ids
, пересечь их и отфильтровать объединенные множества на основе этого списка:
$left = collect([Model::find(1), Model::find(2), Model::find(3)]);
$right = collect([Model::find(1), Model::find(3), Model::find(5)]);
$merged = $left->merge($right);
$ids = array_intersect($left->pluck('id')->toArray(), $right->pluck('id')->toArray());
$result = $merged->filter(function ($value, $key) use ($ids) {
return in_array($value->id, $ids);
});