2017-04-03 14 views
0

私は過去2日間の問題で苦労してきました。私はLaravelを使い始めましたし、Eloquent-syntaxが本当に好きです! しかし、私は3つのモデルの間に正しい関係を得ようとしているときに問題があります。Laravel多対多3機種

私は、このセットアップを持っている:

番組表は

  • 私は

    を持っている私のイベントモデルでは

をROLE_ID

  • のuser_idをEVENT_IDが含まれています
    public function programs(){ 
        return $this->hasMany(Program::class); 
    } 
    
    私は

    public function programs(){ 
        return $this->hasMany(Program::class); 
    } 
    

    を持っていると私のプログラム・モデルは

    public function event(){ 
        return $this->belongsTo(Event::class); 
    } 
    public function user(){ 
        return $this->belongsTo(User::class); 
    } 
    public function role(){ 
        return $this->belongsTo(Role::class); 
    } 
    

    そして私が含まれている私の役割モデルで

    public function programs(){ 
        return $this->hasMany(Program::class); 
    } 
    

    を持っている私のユーザーモデルでは

    次の結果を得る必要があります。

    Events -> Users -> Role 
    

    私のコントローラでは、私は持っています $ events =イベント:: with( 'programs.role.programs.user') - > get();この生成され

    { 
    "id": 2, 
    "name": "Concert: Freddy Kalas", 
    "description": "Freddy Kalas konsert", 
    "user_id": 2, 
    "time_from": "12.04.2017 22:00:00", 
    "time_to": "12.04.2017 23:00:00", 
    "created_at": "2017-03-20 18:28:44", 
    "updated_at": "2017-03-20 18:28:44", 
    "programs": [ 
        { 
         "id": 2, 
        "event_id": 2, 
        "user_id": 2, 
        "role_id": 1, 
        "created_at": null, 
        "updated_at": null, 
        "role": { 
         "id": 1, 
         "name": "Camera operator", 
         "description": "Operates ordinary cameras or PTZ cameras", 
         "created_at": "2017-03-20 20:11:06", 
         "updated_at": "2017-03-20 20:11:06", 
         "programs": [ 
         { 
          "id": 1, 
          "event_id": 3, 
          "user_id": 2, 
          "role_id": 1, 
          "created_at": null, 
          "updated_at": null, 
          "user": { 
          "id": 2, 
          "name": "Dummy Dum", 
          "email": "[email protected]", 
          "created_at": "2017-03-20 16:45:09", 
          "updated_at": "2017-03-20 16:45:09" 
          } 
         }, 
         { 
          "id": 2, 
          "event_id": 2, 
          "user_id": 2, 
          "role_id": 1, 
          "created_at": null, 
          "updated_at": null, 
          "user": { 
          "id": 2, 
          "name": "Dummy Dum", 
          "email": "[email protected]", 
          "created_at": "2017-03-20 16:45:09", 
          "updated_at": "2017-03-20 16:45:09" 
          } 
         } 
         ] 
        } 
        } 
    ] 
    }, 
    { 
        "id": 3, 
    "name": "Prøveproduksjon", 
    "description": "Prøveproduksjon med video og lyd", 
    "user_id": 1, 
    "time_from": "11.04.2017 13:00:00", 
    "time_to": "11.04.2017 17:00:00", 
    "created_at": "2017-04-03 17:12:37", 
    "updated_at": "2017-04-03 17:12:37", 
    "programs": [ 
        { 
         "id": 1, 
        "event_id": 3, 
        "user_id": 2, 
        "role_id": 1, 
        "created_at": null, 
        "updated_at": null, 
        "role": { 
         "id": 1, 
         "name": "Camera operator", 
         "description": "Operates ordinary cameras or PTZ cameras", 
         "created_at": "2017-03-20 20:11:06", 
         "updated_at": "2017-03-20 20:11:06", 
         "programs": [ 
         { 
          "id": 1, 
          "event_id": 3, 
          "user_id": 2, 
          "role_id": 1, 
          "created_at": null, 
          "updated_at": null, 
          "user": { 
          "id": 2, 
          "name": "Dummy Dum", 
          "email": "[email protected]", 
          "created_at": "2017-03-20 16:45:09", 
          "updated_at": "2017-03-20 16:45:09" 
          } 
         }, 
         { 
          "id": 2, 
          "event_id": 2, 
          "user_id": 2, 
          "role_id": 1, 
          "created_at": null, 
          "updated_at": null, 
          "user": { 
          "id": 2, 
          "name": "Dummy Dum", 
          "email": "[email protected]", 
          "created_at": "2017-03-20 16:45:09", 
          "updated_at": "2017-03-20 16:45:09" 
          } 
         } 
         ] 
        } 
        } 
    ] 
    } 
    

    を私はモデルがお互いに関連して取得することはできません - それはそうです。私が望む好ましい結果は、すべてのイベントが多くのユーザーと結びついており、そのイベントのすべてのユーザーが1つの役割に結びついているということです。どうすればLaravelとEloquentでこれを達成できますか?

    ありがとうございました!

    EDIT: iは番組表の

    $events = Event::with('programs.role.programs.user')->get(); 
    

    コンテンツ上記の結果を生成するには、次のコードを使用してデータをフェッチするには

    # id, event_id, user_id, role_id, created_at, updated_at 
    '1', '3', '2', '1', NULL, NULL 
    '2', '2', '2', '1', NULL, NULL 
    

    これが意味するであろうというのIDを持つユーザー2は1の役割を持つイベント3と1の役割を持つイベント2にのみ関連しています。結果から分かるように、両方のイベントには役割1と2があります。悪い説明を申し訳ありません..

  • +0

    あなたの関係はよく見えます。これはおそらく、あなたのデータが得意ではない方法です。あなたのコードで動作していない部分を投稿できますか? – ettdro

    +0

    申し訳ありません@ettdro - 元の投稿にそれを含めてください。更新された質問をご覧ください。 –

    +0

    それはあなたがそこに得たものではありませんか?私は本当にあなたが欲しいものを理解するか分からないのですか?あなたの '$ event'が返すものを見ると、2人のユーザとそれらに関連するロールを持つイベントがあります。 – ettdro

    答えて

    1

    おそらく、一度に1つずつ作成し、返されるものを見つけようとします。

    @Fredrikエンジェル萌は言った:

    はそれが使用して今働いて得た:2のIDと

    $events = Event::with('programs.role')->with('programs.user')->get();

    +1

    あなたはこれを行うことができると思いますか?$ events = Event :: with( 'programs.role'、 'programs.user') - > get(); ' – fubar

    +0

    @Fredrik Angell Moeは、 ! – ettdro

    +0

    既に気付いた:)気づいた、今すぐ修正。 –

    0

    ユーザのみ1 の役割とイベント3に関連しています結果からわかるように、 イベントには、ロール1とロール2の両方があります。

    2つの値を使用しています。 1つはuserのidで、2つ目はeventのidです。

    Laravelは、2つのモデル間でしか定義できません。つまり、あなたはprograme_idとevent_idを使用しています。

    しかし、user_idは無視されています。したがって、user_idでフィルタリングする代わりに、モデルに関連するユーザを追加するだけです。

    この問題を解決する最善の方法は、2つ以上のモデル間の関係を取得する必要がある生のクエリに対してrelationを使用する代わりにです。