Ларавель красноречиво рассказывает, как получить всех родителей

#laravel #eloquent #parent

Вопрос:

У меня есть такое отношение:

Отношение БД

У меня есть код в моей модели, который возвращает мне только одного родителя:

     public function AllParents()

   {
      return $this->belongsToMany($this, 'parent', 'product_id', 'parent_id')
            ->select('parent', 'name');
   }
 

Я получаю это в своем контроллере вот так:

 private function product(Product $product)
{
    return $product->Product()
        ->with('AllParents')
        ->get();
}
 

Наконец-то мне нужны такие данные:

Product1/Product_2/Product_3

Я думаю, что мне нужна петля, но как это сделать в красноречивом?

Комментарии:

1. Я думаю, что вместо дополнительной таблицы вы можете добавить parent_id в ту же таблицу . если у вас нет для этого какого-либо дополнительного поля

2. есть ли какая-либо ошибка .можете ли вы также упомянуть запрос, который вы пробовали

3. @Джон Лобо, таким образом, у него может быть несколько родителей.

4. Я не могу редактировать базу данных

5. Используйте while петлю. while (! is_null($product->AllParents()))

Ответ №1:

Просто измените отношения. Вы неправильно назвали имя сводной таблицы.

 public function AllParents()
{
   return $this->belongsToMany(Product::class, 'Product_parent', 'product_id', 'parent_id') ->select('parent', 'name');

}
 

и тогда вы сможете получить доступ

 AppModelsProduct::with('AllParents')->get()
 

Ответ №2:

В вашей Модели Продукта. У вас есть такие отношения, как эти.

  public function allParents()
 {
     return $this->belongsToMany(Product::class, 'product_parents', 'product_id', 'parent_id')->select('name');
 }
 

И в контроллере вы можете получить всех родителей с нетерпеливой загрузкой.

  Product::with('allParents')->find($productId);
 

И, в представлении, вы можете использовать цикл foreach для повторения каждого родительского объекта.

  @foreach ($product->allParents as $parentProduct)
      {{ $parentProduct->name }}
 @endforeach
 

Ответ №3:

Я сделал так: я изменил свой контроллер

 private function product(Product $product)
{
    $allParents = [];
    $parent = null;
    $parent->$product->Product()->with('AllParents')->first()->id;
    while ($parent != null) {
        array_push($allParents, Product::all->find($parent));
        $parent = Product::all()->find($parent) - first();
    }
}