2016-10-17 7 views
0

私はテーブル間のリレーションを作る方法を知りたい:複雑な関係

私はshopsテーブルとusersテーブルを持っています。
usersテーブルに関連付ける:ショップ(id)ANDエリア(これはショップのグループ)です。
私は美しく正しい方法でそれを行う方法がわかりません。

例えば、非常に複雑な方法で我々が有することができる:5つのショップの全

エリアAは、[エリアB(3店)とエリアC(1店舗)]及び1店を含んでいます。
ジョンは、エリアA、エリアXおよび他の3店舗(エリアなし)に関連付けられています。

これをデータベースで表す方法は? これは、再帰的なことのようだ:(事前による

おかげであなたはおそらく次の表にしたいと思います

+0

私はこれらのテーブルを作成します。USER、AREA、SHOP、AREA_TO_SHOP、AREA_TO_USER、SHOP_TO_USER – Daan

+0

私はあなたがあなたに起こって複数のネストされた領域を有するサポート構造を与える領域テーブルの入れ子集合のパターンを実装したいと思いますあなたが必要とするほど深い。 https://github.com/etrepat/baumこれを使うには、 'users'テーブル、' areas'テーブル、 'shops'テーブルが必要です。 – user3158900

答えて

0

:!あなたの例のためにその後

​​

を、行は

のようになります。

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 

次に、あなたのようなネストされた区域のためのあなたの関係を定義することができます0

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

その他の関係はかなり単純です。

これはテストされておらず、少し微調整が必​​要な場合がありますが、最も重要なアイデアがそこに届きます。それ以外の場合は、事前構築されたネストされたセットライブラリを使用することもできます。

関連する問題