2016-05-24 12 views
0

私はテーブルの記事を持っており、それがフィールドarticle_idを持っており、私の機能で、私は$request['option']で、関連するテーブルの名前を送っていたテーブルcommentsviewslikes関連だ、のコメントたとえば、ajaxを使用して、最も多くコメントされている上位5件の記事を取得します。しかし私の関数では、article_idscountsというクエリ結果から得ています。そしてforeachループで結果を繰り返して、article_idという記事オブジェクトを取得しています。私は、最初のクエリの各結果に対してそのクエリを実行しないようにしたいと思います。それをもっとエレガントに、またDBへの呼び出しが何もないようにする方法は何でしょうか?Laravelクエリ - 関連テーブルから取得したオブジェクトとそのカウント

これは私のコードです:

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

あなたが関係を使用するか、または加入することができます。しかし、このコードが正しい場合は、わかりません:

$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; 
関連する問題