2014-05-11 74 views
0

目前,當我取回「消息」,它呈現n+1問題:防止雄辯查詢n + 1個

select * from `messages` where `messages`.`alert_id` = '21' 

這有時會被複制超過100 +倍!

控制器功能:

public function getIndex() { 
    $alerts = Alert::with('location') 
       ->where('user_id', '=', Auth::user()->id) 
       ->get(); 
    $this->layout->content = View::make('agents.index', 
            array('alerts' => $alerts)); 
} 

警報型號:

public function location() 
{ 
    return $this->belongsTo('Location'); 
} 

public function messages() 
{ 
    return $this->hasMany('Message'); 
} 

消息模型:

public function alert() 
{ 
    return $this->belongsTo('Alert'); 
} 

public function user() 
{ 
    return $this->belongsTo('User'); 
} 

如果我使用下面的代碼行,我可以看到MySQL是正確,但它不能找到location方法:

$alerts = Alert::with('messages.location') 

SELECT * FROM messages其中messages。 ('21','42')alert_id

我認爲這可能是一個關係問題,但我不確定如何解決它。任何幫助將非常感激。

回答

1

也許我不明白,但我在想,你正在試圖通過它的信息和它的位置得到一個警報。我會這樣做:

public function getIndex() { 
    $alerts = Alert::with('location', 'messages') 
       ->where('user_id', '=', Auth::user()->id) 
       ->get(); 
    $this->layout->content = View::make('agents.index', 
            array('alerts' => $alerts)); 
} 

使用急於加載消息和您的警報位置。

+0

它完美的作品。謝謝@Antoine! – Ben

+0

@Svengali樂於幫忙! –

+0

'$ company = User :: find(Auth :: user() - > id) - > companies() - > with('users.alerts.location.messages') - > first();'是否有原因爲什麼這不起作用@Antoine Augusti?它無法找到'messages'方法? – Ben