我需要附加一个自定义选择的雄辩查询,但我发现整个事情有点难以理解。这涉及论坛系统,其中每个论坛对象需要知道注册了多少个主题关系和评论关系。这是我到目前为止有:优化雄辩查询
在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'...' –
我已经添加了查询,我想我想要雄辩为我产生。 –