2016-12-02 7 views
4

1つのブランドと1つのシーズンにリンクするファブリックテーブルがあります。 App\fabrics::with('brand', 'season')->get()を実行すると、すべてのファブリックとそのブランドと季節の情報が得られます(下記参照)。Laravel 5.3親モデルからテーブルを結合する際のEloquent where節

シーズンIDに基づいてファブリックを取得したいと考えています。私が試した:

App\fabrics::with('brand', 'season')->where('season.id', '1')->get()

をしかし、これは動作しません。

Column not found: 1054 Unknown column 'season.id' in 'where clause' (SQL: select * from `fabrics` where `season`.`id` = 1)' 

ファブリックを取得してフィルタリングすることは可能ですか?

明らかに私は季節モデルApp :: seasonから布を得ることができますが、それが親(布)モデルから達成できるかどうかは疑問でした。 ( 'ブランド'、 '季節')との

のApp \生地からすべての情報に:: - >(取得)

>>> App\fabrics::with('brand', 'season')->get() 
=> Illuminate\Database\Eloquent\Collection {#794 
    all: [ 
     App\Fabrics {#786 
     id: 1, 
     fabric_code: "GMAN01", 
     fabric_design: "ANODA", 
     fabric_price_group: "I", 
     fabric_retail_price: "27.00", 
     fabric_trade_price: null, 
     fabric_width: 141, 
     fabric_pattern_repeat: 1, 
     fabric_fiber: "48% POLYESTER 44% COTTON 8% VISCOSE", 
     fabric_online: 1, 
     fabric_available: 1, 
     fabric_meters_remaining: 256.78, 
     fabric_virutal_meters_remaining: 216.28, 
     created_at: "2016-12-02 10:52:09", 
     updated_at: "2016-12-02 13:08:07", 
     brand_id: 1, 
     season_id: 1, 
     brand: App\Brands {#742 
      id: 1, 
      brand_name: "*****", 
      created_at: "2016-12-02 11:36:10", 
      updated_at: "2016-12-02 11:36:10", 
     }, 
     season: App\Seasons {#795 
      id: 1, 
      season_name: "Autumn/Winter 2016", 
      season_code: "AW16", 
      created_at: "2016-12-02 13:07:50", 
      updated_at: "2016-12-02 13:07:50", 
     }, 
     }, 
     App\Fabrics {#765 
     id: 2, 
     fabric_code: "GMAN02", 
     fabric_design: "ANODA", 
     fabric_price_group: "I", 
     fabric_retail_price: "27.00", 
     fabric_trade_price: null, 
     fabric_width: 141, 
     fabric_pattern_repeat: 1, 
     fabric_fiber: "48% POLYESTER 44% COTTON 8% VISCOSE", 
     fabric_online: 1, 
     fabric_available: 0, 
     fabric_meters_remaining: 20.0, 
     fabric_virutal_meters_remaining: 17.0, 
     created_at: "2016-12-02 10:52:09", 
     updated_at: "2016-12-02 13:14:56", 
     brand_id: 2, 
     season_id: 1, 
     brand: App\Brands {#770 
      id: 2, 
      brand_name: "*****", 
      created_at: "2016-12-02 11:36:10", 
      updated_at: "2016-12-02 11:36:10", 
     }, 
     season: App\Seasons {#795}, 
     }, 
     App\Fabrics {#791 
     id: 3, 
     fabric_code: "JBBU01", 
     fabric_design: "BURDOCK", 
     fabric_price_group: "D", 
     fabric_retail_price: "16.00", 
     fabric_trade_price: null, 
     fabric_width: 140, 
     fabric_pattern_repeat: 64, 
     fabric_fiber: "100% COTTON", 
     fabric_online: 0, 
     fabric_available: 1, 
     fabric_meters_remaining: 856.1, 
     fabric_virutal_meters_remaining: 856.1, 
     created_at: "2016-12-02 10:52:09", 
     updated_at: "2016-12-02 13:08:13", 
     brand_id: 3, 
     season_id: 4, 
     brand: App\Brands {#787 
      id: 3, 
      brand_name: "*****", 
      created_at: "2016-12-02 11:36:10", 
      updated_at: "2016-12-02 11:36:10", 
     }, 
     season: App\Seasons {#775 
      id: 4, 
      season_name: "Spring/Summer 2015", 
      season_code: "SS15", 
      created_at: "2016-12-02 13:07:50", 
      updated_at: "2016-12-02 13:07:50", 
     }, 
     }, 
    ], 
    } 

答えて

3

eager loads contrainingのためのクロージャを使用します。

App\fabrics::with(['brand', 'season' => function($q) use($seasonId) { 
    $q->where('id', $seasonId); 
}])->get(); 

あなたの場合シーズンIDでファブリックをフィルタリングしたい場合は、whereHas()

App\fabrics::with('brand', 'season') 
    ->whereHas('season', function($q) use($seasonId) { 
     $q->where('id', $seasonId); 
    })->get(); 
+1

+1を使用して、その機能が呼び出されたかどうかわかりませんでしたそうすることで助けになります。 with()に複数のクロージャを渡すことは可能ですか?たとえば、シーズンIDでフィルタリングし、ブランドIDでフィルタリングしますか? – twigg

+1

もちろん、すべての関係にClosureを使用することができます。 –

+0

素晴らしいありがとう。 $ seasonId変数は、私が推測している異質なものによって作成されていますか? – twigg

関連する問題