Имеет много ссылок на себя в laravel, возвращает пустой набор

#laravel #eloquent

Вопрос:

Я использую laravel v8, и у меня есть products таблица для хранения данных о продукте, у продукта будет дочерний продукт, и я подключаю его с помощью product_relations таблицы.

products стол:

ID Имя
1 ПК
2 Мышь
3 VGA

product_relations стол

ID parent_product_id детский продукт_ид
1 1 2
2 1 3

Я хочу получить модель дочернего продукта, используя модель родительского продукта, для достижения этой цели я пытаюсь использовать hasManyThrough функцию в модели класса следующим образом;

 class Product extends Model{
    protected $primaryKey = 'id';
    protected $table = 'products';
    public function childs(){
        return $this->hasManyThrough(self::class, ProductRelation::class, 'child_product_id', 'id');
    }
}

class ProductRelation extends Model{
    protected $primaryKey = 'id';
    protected $table = 'product_relations'; 
}
 

затем я попытался извлечь его вот так:

 $childs = Product::find(1)->childs()->get();
 

но он возвращает пустой набор моделей продуктов

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

1. Я так понимаю, что есть только 2 уровня отношений, т. Е. parent > > child и не parent > > child > > grandchild и т. Д.?

2. да @Rwd только родитель > ребенок

3. Почему бы просто не иметь родительский идентификатор и отношения «один ко многим»? Примечание сбоку: я бы изменил childs на children

4. @GertB. к сожалению, у меня нет полномочий изменять структуру БД

5. В этом случае вы ищете belongsToMany с product_relations в качестве сводной таблицы

Ответ №1:

1 — такого рода отношения не нужны. потому что родительский продукт и дочерние продукты имеют отношения «один ко многим», а не «многие ко многим».

2 — hasManyThrough получить адрес класса назначения не самостоятельно::класс.(например: детский продукт::класс)

Ответ №2:

Вы ищете соотношение «многие ко многим» с помощью сводной таблицы:

 public function childs(){
    return $this->belongsToMany(self::class, 'product_relations', 'parent_product_id', 'child_product_id');

    }