У меня есть массив строк, которые помогают мне инициировать и find()
связанные модели.
$arr = [
"App\Post" => 1,
"App\Video" => 1
];
// this array is [Model => ModelId]
На данный момент я инициирую класс модели из строки и использую find()
, чтобы найти объект модели.
У меня также есть 2 отношения morphByMany()
в моей модели User, которая возвращает мне коллекцию обоих.
// class User
public function entities() {
// this returns merged collection successfully
return ($this->videos)->merge($this->posts);
}
На этом этапе, если я попробую с contains()
, , это будет работать :
foreach ($arr as $modelString => $modelId) {
// this finds the related model:
$model = $modelString::find($modelId)->first();
$this->entities()->contains($model); // returns true
}
Однако, если я попытаюсь создать новую коллекцию на основе моих инициированных моделей, $collection->diff($collection2)
или $collection->intersect($collection)
не будет работать .
$collection1 = $this->entities();
$collection2 = collect();
foreach ($arr as $modelString => $modelId) {
$model = $modelString::find($modelId)->first();
$collection2->push($model);
}
$collection1->diff($collection2); // returns all items
$collection1->intersect($collection2); // returns []
// intersect() and diff() should be other way around
(Просто чтобы очистить, и $this->entities()
, и $arr
имеют одинаковые модели. Единственное отличие состоит в том, что $this->entities()
возвращает сводные значения вместе с моделью, тогда как значения, инициированные из $arr
, не имеют; однако contains()
работа.