簡體   English   中英

帶有 Pivot 的嵌套項目 -> 孩子沒有得到 pivot 數據

[英]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 { /** ... */ }

現在,您正在急切地加載查詢Itemschildren()關系,這是一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM