На самом деле мне не терпелось загрузить «родителя», и, похоже, красноречиво использует один и тот же объект отношения для всех элементов в коллекции, если отношение уже загружено раньше.Вид того, что я понял или догадался.
Я решил это, вручную установив атрибут отношения и клонировав «родительский» объект для каждого элемента в коллекции.Не очень элегантно, но работает для меня сейчас.
Пожалуйста, дайте мне знать, если у вас есть лучшее решение, используя laravel или красноречивые ленивые методы загрузки
$parentIds = $index->whereIn('content_type', ['type1', 'type2'])->load('owner')->pluck('owner.parent_id')->unique()->toArray();
$parents = collect([]);
foreach($parentIds as $singleParentId) {
$parent = Parent::where('id',$singleParentId)->with('tags', 'category', 'titles')->withCount('allComments')->get()[0];
$parents->put($singleParentId, $parent);
}
$index->transform(function($single) use ($parents) {
if($single->content_type === 'type1' || $single->content_type === 'type2') {
$single->owner->setAttribute('parent', clone $parents->get($single->owner->parent_id));
}
return $single;
});
$index->transform(function($single) {
if($single->content_type === 'type1') {
$fileNames = FileNames::where('parent_id', $single->owner->parent->id)->orderByRaw('lower(file_name) ASC')->limit(8)->get();
$single->owner->parent->setAttribute('file_names', $fileNames);
} else if($single->content_type === 'type2') {
$fileNames = FileNames::where('parent_id', $single->owner->parent->id)->where('id', $single->owner->id)->get();
$single->owner->parent->setAttribute('file_names', $fileNames);
}
return $single;
});