2016-10-17 3 views
0

Я хочу знать, как сделать отношения между таблицами:Сложные отношения в базе данных (с Laravel)

У меня есть shops стола и users стола.
Я хочу связать с таблицей users: магазины (id) И область (это группа магазинов).
Я не знаю, как это сделать красивым и правильным способом.

Например, в очень сложным образом мы можем иметь:

Область A содержит [Area B (3) магазины и зона C (1 магазин)] и 1 магазина: в общей сложности 5 магазинов.
John ассоциируется с Районом A, площадью X и тремя другими магазинами (без области).

Как представить это в базе данных? Это как рекурсивный вещь :(

Спасибо по заранее

+0

Я бы создал следующие таблицы: USER, AREA, SHOP, AREA_TO_SHOP, AREA_TO_USER, SHOP_TO_USER – Daan

+0

Я думаю, что вы хотите реализовать шаблон вложенного набора для таблицы областей, который даст вам структуру, которая поддерживает несколько вложенных областей так глубоко, как вам нужно. https://github.com/etrepat/baum. Используя это, вам просто нужна таблица 'users', таблица' areas' и таблица 'магазины'. – user3158900

ответ

0

Вы, вероятно, хотите иметь следующие таблицы:

users 
    - id 
    - username 

shops 
    - id 
    - name 

areas 
    - id 
    - name 
    - parent_id 

user_shop 
    - user_id 
    - shop_id 

area_shop 
    - shop_id 
    - area_id 

Тогда для примера, строка может выглядеть

users 
    id: 1 
    username: jappleseed 

shops 
    id: 1 
    name: some shop name 

    id: 2 
    name: some other shop name 

areas 
    id: 1 
    name: Area A 
    parent_id: null 

    id: 2 
    name: Area B 
    parent_id: 1 

    id: 3 
    name: Area C 
    parent_id: 1 

area_shop 
    area_id: 2 
    shop_id: 1 

    area_id: 2 
    shop_id: 2 

Тогда вы могли бы определить свои отношения для вложенных областей, как:

class Area extends Model { 

    /** 
    * Parent Area 
    */ 
    public function parent_area() 
    { 
     return $this->belongsTo('Area', 'parent_id'); 
    } 

    /** 
    * Child Areas 
    */ 
    public function child_areas() 
    { 
     return $this->hasMany('Area', 'parent_id', 'id'); 
    } 
} 

Другие отношения должны быть достаточно простыми.

Это не проверено и может потребоваться небольшая настройка, но основная идея должна быть там. В противном случае также будет работать с использованием предварительно построенной библиотеки вложенных множеств.