2015-03-31 98 views
0

我有兩種模式,啤酒和發行版,它們有多對多的關係。包含啤酒的一些相關信息(例如價格和狀態)的桶模型hasMany桶。當我建立我的啤酒指數時,我需要啤酒模型,分銷商模型和桶模型的所有信息。我試圖弄清楚的是如何以有效的方式查詢所有信息。這裏是我當前的查詢:查詢'跨'數據透視表

小桶的是在狀態作用域:

public function scopeStatus($query, $status) 
{ 
    return $query->where('status', '=', $status); 
} 

,我建我的啤酒指數有:

$kegs = Keg::status($status)->get(); 
    $beers=[]; 
    foreach ($kegs as $keg){ 
     $beer = Beer::find($keg->beer_distribution->beer_id); 
     $distributor = Distributor::find($keg->beer_distribution->distributor_id); 
     $beers[]=[ 
     'beer' => $beer, 
     'keg' => $keg, 
     'distributor' => $distributor]; 
    } 

    return $beers; 

我知道,這是一個緩慢的查詢,但林不知道如何在單個查詢中執行此操作。有什麼方法可以更快地運行?

一些相關型號代碼:

class Beer extends Eloquent { 

    public function distributors() 
    { 
      return $this->belongsToMany('Distributor', 'beer_distributions'); 
    } 



class BeerDistribution extends Eloquent { 

    protected $fillable = ['beer_id', 'distributor_id']; 

    public function kegs() 
    { 
     return $this->hasMany('Keg', 'beer_distribution_id'); 
    } 



class Distributor extends Eloquent { 

    public function beers() 
    { 
     return $this->belongsToMany('Beer', 'beer_distributions'); 
    } 



class Keg extends Eloquent { 

    public function scopeStatus($query, $status) 
    { 
    return $query->where('status', '=', $status); 
    } 

    public function beerDistribution() 
    { 
    return $this->belongsTo('BeerDistribution'); 
    } 

} 
+1

你見過[HasManyThrough](http://laravel.com/docs/5.0/eloquent#has-many-through)嗎? – Ravan 2015-03-31 03:50:34

+0

如果我爲與啤酒連接的每個分銷商設置了多個酒桶,這種方式會起作用嗎? – hodale 2015-03-31 03:55:38

回答

0

所以我想通了,我真正需要做的是增加我的小桶模型我的查詢建立關係(這是兩國關係的巢fatherest「向下」 ),然後使用急切加載!

現在我建立我的啤酒指數像這樣:

$beers=[]; 
foreach (Keg::status($status) 
    ->with('kegsize', 
     'beerDistribution.beer.brewery', 
     'beerDistribution.beer.style', 
     'beerDistribution.distributor')->get() as $keg){ 
    $beers[]=$keg; 
} 
return $beers; 

這使我到一個驚人的共10個查詢。