我需要附加一個自定義選擇的雄辯查詢,但我發現整個事情有點難以理解。這涉及論壇系統,其中每個論壇對象需要知道註冊了多少個主題關係和評論關係。這是我到目前爲止有:優化雄辯查詢
在Forum.php
public function getNumTopics() {
return Topic::where('forum_id', '=', $this->id)->count();
}
public function getNumComments() {
return Comment::wherein('topic_id', Topic::where('forum_id', '=', 1)->lists('id'));
}
控制器返回JSON
public function getCategories() {
$categories = ForumCategory::with('forums')->get();
foreach ($categories as $cat) {
if ($cat->forums->count() > 0) {
foreach ($cat->forums as $forum) {
/* @var $forum Forum */
$forum->num_topics = $forum->getNumTopics();
$forum->num_posts = $forum->getNumComments();
}
}
}
return Response::json($categories, 200);
}
通話時間約爲1300ms返回5分論壇三類別。我懷疑這是因爲這會執行大約16個查詢而不是一個。有沒有辦法將「num_topics」和「num_posts」附加爲select的屬性,以便我只執行一個查詢?
編輯
我基本上想要的是雄辯產生這樣的事情時,我問Forum::all()
:
select f.*,
ifnull(count(t.id), 0) num_topics,
ifnull(count(c.id), 0) num_posts
from forums f left join topics t on t.forum_id = f.id
left join comments c on c.topic_id = t.id
group by f.id
我試圖優化的第一件事是getNumComments函數,它運行兩個查詢。另外你的getNumtTopics和getNumComments都運行基本相同的查詢,'Topic :: where('forum_id'...' –
我已經添加了查詢,我想我想要雄辯爲我產生。 –