Laravel查询 - 从相关表中获取对象及其计数

时间:2016-05-24 21:11:10

标签: php mysql laravel eloquent

我有表格文章及其相关的表commentsviewslikes,其中包含字段article_id,在我的函数中我发送相关表的名称,使用$request['option'],评论,例如,使用ajax,获得前5篇评论最多的文章。但是在我的函数中,我从article_idscounts获取查询结果,然后我使用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);
  } 

1 个答案:

答案 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;