我有表格文章及其相关的表comments
,views
和likes
,其中包含字段article_id
,在我的函数中我发送相关表的名称,使用$request['option']
,评论,例如,使用ajax,获得前5篇评论最多的文章。但是在我的函数中,我从article_ids
和counts
获取查询结果,然后我使用foreach循环遍历结果并获取我在{}发送的article_id
的文章对象查询。我想避免对第一个查询的每个结果进行查询。如果没有如此多的DB调用,那么更优雅地完成它的方法是什么?
这是我的代码:
public function mostArticle(Request $request) {
$from = $request['from'];
$to = $request['to'];
$result = DB::table($request['option'])
->select(DB::raw('article_id'), DB::raw('count(*) as count'))
->whereDate('created_at', '>=', date($from).' 00:00:00')
->whereDate('created_at', '<=', date($to).' 00:00:00')
->groupBy('article_id')
->orderBy('count', 'DESC')
->take(5)
->get();
foreach($result as $val){
$article = Article::where('id', $val->article_id)->first();
$mostSomethingArticle[$article->id] = [];
$mostSomethingArticle[$article->id]['title'] = $article->title;
$mostSomethingArticle[$article->id]['summary'] = $article->summary;
$mostSomethingArticle[$article->id]['count'] = $val->count;
}
return json_encode($mostSomethingArticle);
}
答案 0 :(得分:0)
您可以使用关系或联接。但我不确定,如果这段代码是正确的:
$result = DB::table($request['option'])
->select('article.id', 'article.title', 'article.summary', DB::raw('count('.$request["option"].'.id) as count'))
->join('article', 'article.id', '=', $request['option']."article_id")
->whereDate('created_at', '>=', date($from).' 00:00:00')
->whereDate('created_at', '<=', date($to).' 00:00:00')
->groupBy('article_id')
->orderBy('count', 'DESC')
->take(5)
->get();
return $result;