Как вы сказали, вы уже получаете пивот между вашим user
и родителем item
. Вот почему вы получаете атрибут pivot:
Illuminate\Database\Eloquent\Collection {#3247
all: [
App\Item {#3232
id: 2,
parent_id: null,
title: "Parent 1", // <-----------
pivot: Illuminate\Database\Eloquent\Relations\Pivot { /** ... */ }
Теперь вы стремитесь загрузить отношение children()
запрашиваемого Items
, это отношение hasMany
, поэтому эти записи равнынет элемента сводки.
Если вам нужно вывести эти данные, вы можете просто показать родительскую запись для каждого дочернего элемента. Теперь, если вам действительно необходимо добавить родительские сводные данные в эти дочерние записи, вы можете реплицировать родительские данные, отображающие извлеченную коллекцию и добавив данные в каждый дочерний элемент:
$users = $user->items()->whereNull('parent_id')->with('children')->get();
$users = $users->map(function ($user) {
$user->items->map(function ($parent) {
$parent->children->map(function ($child) use ($parent) {
$child->attribute = $parent->attribute;
return $child;
});
return $parent;
});
return $user;
});
В этом примере сейчасу каждого ребенка Item
будет скопирован родительский элемент attribute
. Недостатком этого решения является то, что родительские данные будут такими же, как те, которые добавлены к дочерним данным, хотя я не знаю, является ли это желаемым результатом.
Кроме того, имейте в виду, что все этопроцесс выполняется в памяти, поэтому вы всегда должны контролировать количество извлекаемых данных, чтобы избежать проблем с памятью.
Другой альтернативой является непосредственное отношение дочерних элементов Items
к объектам User
. Таким образом, каждый дочерний элемент будет иметь свои собственные сводные данные, и вам не нужно будет загружать отношения children()
на своих родителей Items
. Конечно, вы можете сгруппировать их так, чтобы у вас была иерархия, соответствующая вашим потребностям, или просто различить родителей и их детей по значению parent_id
.