2016-10-12 9 views
-1

投稿とコメントの2つのテーブルがあります。各投稿には多くのコメントがあります。私は彼が今までに返信したすべての投稿を、ユーザーの最後のコメントを取得する必要があります。彼が複数の投稿にコメントしたように、私はその投稿に最後のコメントだけが必要です。 彼が10回の投稿に43回コメントした場合、10のコメント(各投稿の最後のもの)のみが必要です。laravelで各外部キーの最終値を取得する方法は?

私が試した:

Comment::where('user_id', $user_id) 
       ->orderBy('created_at','DESC') 
       ->distinct('post_id') 
       ->get(); 

をしかし、それはすべての彼のコメントを返します。

+0

「すべてのコメントを返す」とはどういう意味ですか? 'distinct( 'post_id')'をお持ちの場合は、最新のコメントを投稿ごとに取得する必要があります。 db行のサンプルと、フェッチする行/取り出す行を指定できますか? –

答えて

0

あなたの '投稿'モデル( 'post.php')に関係を置いてください。お使いのコントローラで

public function comments(){ return $this->hasMany('App\Comments','id_post','id'); }

public function last10comment(){ return $this->comments()->orderBy('created_at','DESC')->take(10)->get(); }

試し:各ポストの コール$ポスト> last10comment() `//戻り配列/コレクション

+0

これはどのようにOPの問題を解決しますか?あなたがコメントした投稿の数がわからないときに 'take 'を使うのは意味がありません。ユーザーが50の投稿にコメントした場合、 ' - > take 'を50に変更しますか?私はこれがOPの後にあるとは思わない... –

+0

OK、私はそれを修正した。 OPがユーザーからの各投稿の最後の10コメントをすべて表示したい場合は、各投稿の "$ post-> last10comment"を呼び出してください。または.map関数を使用する –

0

私はサンプルのコメント表を作ってきたし、次のDBクエリで試してみると、目的の結果が返されます。

ここにコードがあります。

$data = DB::table('comments as c1') 
       ->select('c1.col_2', 'c1.col_2') 
       ->leftJoin('comments as c2', function($join) { 
        $join->on('c1.post_id', '=', 'c2.post_id'); 
        $join->on('c1.id', '<', 'c2.id'); 
       }) 
       ->whereNull('c2.id') 
       ->limit(10) 
       ->get(); 
関連する問題