#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');
}