[英]Nested items with Pivot -> children do not get the pivot data
我正在嘗試為我的user
model 構建嵌套items
的可能性。
實際上,每個user
都可以有很多items
,它們可以有自己的類型( item
)的children
項。
這是用戶與item
的關系:
/**
* @return \Illuminate\Database\Eloquent\Relations\belongsToMany
*/
public function items()
{
return $this->belongsToMany(Item::class)->withPivot( 'value'');
}
children
是這樣解決的:
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function children()
{
return $this->hasMany(Item::class, 'parent_id');
}
現在 - 感謝您之前的幫助 - 我可以查詢有孩子的項目:
$user->items()->whereNull('parent_id')->with('children')->get();
這是結果:
Illuminate\Database\Eloquent\Collection {#3247 all: [ App\Item {#3232 id: 2, parent_id: null, title: "Parent 1", pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3235 user_id: 12, user_item_id: 2, value: "3", }, children: Illuminate\Database\Eloquent\Collection {#3267 all: [ App\Item {#3270 id: 3, parent_id: 2, title: "Child 1", created_at: "2019-10-04 14:29:59", updated_at: "2019-10-04 14:29:59", }, App\Item {#3272 id: 4, parent_id: 2, title: "Child 2", created_at: "2019-10-04 14:30:16", updated_at: "2019-10-04 14:30:16", }, ], }, }, App\Item {#3255 id: 5, parent_id: null, title: "Parent 2", created_at: "2019-10-04 14:36:50", updated_at: "2019-10-04 14:36:50", pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3240 user_id: 12, user_item_id: 5, value: "50", }, children: Illuminate\Database\Eloquent\Collection {#3266 all: [], }, }, ], }
如您所見, parent
項獲得了 pivot 值 - children
項沒有任何 pivot 數據。 我該如何解決? 我了解到, hasMany
不提供 pivot。
在這種情況下,如何將 pivot 數據添加到嵌套children
項?
正如您所說,您已經在user
和 parent item
之間檢索 pivot 。 這就是您獲得 pivot 屬性的原因:
Illuminate\Database\Eloquent\Collection {#3247
all: [
App\Item {#3232
id: 2,
parent_id: null,
title: "Parent 1", // <-----------
pivot: Illuminate\Database\Eloquent\Relations\Pivot { /** ... */ }
現在,您正在急切地加載查詢Items
的children()
關系,這是一個hasMany
關系,這就是為什么這些記錄沒有 pivot 元素。
如果您需要 output 這個數據,您可以只顯示每個孩子的父記錄。 現在,如果您確實需要將父 pivot 數據添加到這些子記錄,您可以復制映射檢索到的集合的父數據並將數據添加到每個子元素:
$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
。 此解決方案的缺點是父數據將與添加到子數據的數據相同,但我不知道這是否是您想要的 output。
另外,請記住,所有這些過程都是在 memory 中進行的,因此您應該始終控制檢索的數據量以避免 memory 問題。
另一種選擇是將子Items
直接與User
對象相關聯。 這樣,每個子項都將擁有自己的 pivot 數據,您無需在父Items
上急切加載children()
關系。 當然,您可以將它們分組以具有適合您需要的層次結構,或者僅通過parent_id
的值來區分父級和它們的子級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.