Запрос для вложенной модели возвращает дубликаты - PullRequest
0 голосов
/ 06 октября 2019

на данный момент я много узнаю о Laravel и красноречивых, поэтому, пожалуйста, прости мои "глупые" вопросы.

Моя цель

Я хотел бы save вложенных элементов иget их позже с вложенной структурой

Пример:

 Illuminate\Database\Eloquent\Collection {#3246
     all: [
       App\Item {#3254
         id: 2,
         parent_id: null,
         title: "Parent",
         created_at: "2019-10-04 14:22:23",
         updated_at: "2019-10-04 14:22:23",
         children: Illuminate\Database\Eloquent\Collection {#3285
           all: [
             App\Item {#3287
               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 {#3289
               id: 4,
               parent_id: 2,
               title: "Child 2",
               created_at: "2019-10-04 14:30:16",
               updated_at: "2019-10-04 14:30:16",
             },
           ],
         },
       },
     ],
   }

Текущий результат

Мой текущий результат таков:

 Illuminate\Database\Eloquent\Collection {#3246
     all: [
       App\Item {#3254
         id: 2,
         parent_id: null,
         title: "Parent",
         created_at: "2019-10-04 14:22:23",
         updated_at: "2019-10-04 14:22:23",
         children: Illuminate\Database\Eloquent\Collection {#3285
           all: [
             App\Item {#3287
               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 {#3289
               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 {#3259
         id: 3,
         parent_id: 2,
         title: "Child 1",
         created_at: "2019-10-04 14:29:59",
         updated_at: "2019-10-04 14:29:59",
         children: Illuminate\Database\Eloquent\Collection {#3282
           all: [],
         },
       },
       App\Item {#3280
         id: 4,
         parent_id: 2,
         title: "Child 2",
         created_at: "2019-10-04 14:30:16",
         updated_at: "2019-10-04 14:30:16",
         children: Illuminate\Database\Eloquent\Collection {#3275
           all: [],
         },
       },
     ],
   }

Как видите, элементы возвращаются как children, но также как отдельные (повторяющиеся) элементы в списке.

Мой код

Элемент

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable
        = [
            'title',
        ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function parent()
    {
        return $this->belongsTo('App\Item', 'parent_id');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function children()
    {
        return $this->hasMany('App\Item', 'parent_id');
    }

}

Как получить связанные items:

$user->items()->with('children')->get();

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Просто запросите элементы, которые являются родителями, пару способов здесь

$user->items()->whereDoesntHave('parent')->with('children')->get();

Или

$user->items()->with('children')->where('parent_id', null)->get();

Теперь вы не получите дублированные результаты

1 голос
/ 06 октября 2019

Вы можете сначала получить элементы без parent_id, используя whereNull ()

Затем загрузить дочерние элементы тех, кто использует with ()

$user->items() whereNull('parent_id')->with('children')->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...