2017-11-07 14 views
0

3方向ピボットテーブルを使って作業するとき、Laravelで熱心な読み込みができるように苦労しています。次のようにデータベースが設定されている:redeemsが明らかにピボットテーブルであるEager load three wayピボットテーブルLaravel

+-------+--------+-------+-------------+ 
| deals | venues | users | redeems | 
+-------+--------+-------+-------------+ 
| id | id  | id | deal_id  | 
| title | name | name | user_id  | 
|  |  |  | venue_id | 
|  |  |  | redeemed_at | 
+-------+--------+-------+-------------+ 

<?php 

class User extends Authenticatable 
{ 
    /** 
    * The deals redeemed by the user. 
    */ 
    public function deals() 
    { 
     return $this->belongsToMany(Deal::class, 'redeems') 
      ->withPivot(['venue_id', 'redeemed_at']); 
    } 
} 

これは私がこれを行うことができます::

$users = Users::with('deals')->all(); 

をそして私は、ユーザーの素敵な概要と、彼らはのような構造に償還したすべての取引を取得するユーザモデルは次のようになりますこの:

{ 
    "id": 1, 
    "name": "Diederik", 
    "deals": [ 
    { 
     "id": 33, 
     "title": "Deal Title", 
     "pivot": { 
     "user_id": 1, 
     "deal_id": 33, 
     "venue_id": 50 
     } 
    } 
    ] 
} 

今、私はそれをロードする代わりに、その後$user->pivot->venue_idを照会熱心なことで会場の情報を追加したいと思います。

私はdealモデルでbelongsTo関係を設定して、そのような入れ子になったをやってみました:$users = Users::with('deals.venue')->all();が、取引テーブルは会場への外部キーを持っていないので、それは動作しません。これは、複数の会場に取引を適用できるためです。

私はこれが通常のデータベースクエリを使用して非常に簡単に達成できることに気付いていますが、私たちのAPIの仕組みについては、曖昧なwithリレーション機能を使用することが不可欠です。

TLDR:どのようにネストされた3方向ピボットテーブル関係を読み込むか。

答えて

0

私はあなたの質問を正しく理解している場合、特定の会場を取得したい取引と会場の間に1対多の関係があります。通常、あなたはさらに会場をフィルタリングしたい、その後場合は、あなたの取引モデルでhasManyの()またはbelongsToMany()の関係を作成することになり、あなたはそうのような雄弁サブクエリを記述します。

// Gets first venue of deals 
Users::with('deals', 'deals.venues' => function ($query) { 
    $query->first(); 
})->all(); 
+0

ご回答いただきありがとうございます。 「取引」と「会場」の関係は多対多である。複数の会場で取引を交換することができ、会場は複数の異なる取引を提供することができます。したがって、あなたが提案しているものは、それらの2つを結ぶ別のピボットテーブル( 'deals_venue')が存在するため動作しません。 – Diederik

+0

言い換えれば、あなたが提案しているものはうまくいっていますが、その取引を提供するすべての会場を受け取ります。取引が償還される特定の会場ではありません。会場と取引の関係は私の質問にとっては重要ではないので、私は最初の質問からそれを省いたのです。 – Diederik

0

私はsugestうピボットテーブルを別のモデルとして扱います(リセーム)。あなたが必要とするオブジェクトすると、他のテーブル/モデル(ディール/会場/ユーザー)と1対多の関係を作るので、あなただけの怠惰な負荷に次のように雄弁を使用して、クエリを作ることができる:

$redeems = User::find($id)->redeems; 
$redeems->load(['venue','deal']); 

return $redeems; 

フォーマットするにはあなたが使用している場合、正確な方法でデータ/応答API Resourcesを使用することができます5.5。 5.4以下の場合はFractalです。

+0

当然、私はあなたの答えに感謝しますが、私はあなたが示唆したような問題を本当に解決したことを告白する必要があります。しかし、議論のために、私はとにかく質問をここに掲載しました。ある意味では、このように不正をするような感じです。さらに、 'attach'や' sync'のような雄弁な機能を使うことはできません。私はちょうど別の方法があるかどうか疑問に思っていた。 – Diederik

関連する問題