2016-10-05 7 views
0

申し訳ありませんが、説明する方が良いです。我々はあなたがコメントすることができ、Instagramのようなビデオが好きな場所にビデオをアップロードする内部のWebアプリを構築しました。バックエンドはLaravel APIを使用しています。 Laravel:行数をカウントする必要がある関係に基づいて結果を得るには

が 好き

を多くの好きしている - - 毎日私たちは昨日からのような、ほとんどを得との関係は、これが

ビデオ のようである10本の動画に叫び声を配る必要はビデオ

class Stage extends Model 
{ 
    public function likes() 
    { 
    return $this->hasMany('App\likes', 'id'); 
    }... 

class Likes extends Model 
{ 
    public function likes() 
    { 
    return $this->belongsTo('App\Video', 'videoId'); 
    }... 
に属し

私たちは、以下のいずれかを行うことができます知っているが、両方のカウントを取得し、VIDEOID

DB::table('likes') 
->select(DB::raw(" 
    videoId, 
    count(*) as LikeCount")) 
->where('createDate', '>=', Carbon::now()->subDay(1)->toDateString()) 
->where('createDate', '<', Carbon::now()->toDateString()) 
->groupBy('videoId') 
->get(); 

は、方法は私にあります私はカウントを必要としない雄弁でこれを補完するだけで、ビデオ情報のコレクションを取得するためにIDを使用するので、カウントの数が最も多いビデオのIDを必要とします。私たちが多数のユーザーを期待しているので、正確かつ効率的なやり方があるのか​​どうか疑問に思うだけです。

はここ

Schema::create('video', function (Blueprint $table) { 
     $table->increments('id')->unsigned(); 
     $table->integer('userId')->unsigned(); 
     $table->string('name',255)->nullable(); 
     $table->text('description')->nullable(); 
     $table->string('status', 50)->nullable(); 
     $table->text('video')->nullable(); 
     $table->dateTime('createDate')->nullable(); 
     $table->dateTime('upStageDate')->nullable(); 
     $table->foreign('userId')->references('userId')->on('user')-  >onDelete('cascade'); 
    }); 

Schema::create('like', function (Blueprint $table) { 
     $table->integer('videoId')->unsigned(); 
     $table->integer('userId')->unsigned(); 
     $table->datetime('likeDate')->nullable(); 
     $table->foreign('userId')->references('userId')->on('user')->onDelete('cascade'); 
     $table->foreign('videoId')->references('id')->on('video')->onDelete('cascade'); 
    }); 
+0

あなたは左の結合で同じの基本的な実装を試しましたか?そうでない場合は、テーブルのようなビデオテーブルのテーブル構造を共有してください。私が理解していることは、あなたもユーザーに応じて好きなものを追跡しているということです。そうであれば、それぞれのようなものが行として表されます。その場合、「好き」という列を挿入して、挿入すると1に設定することができます。同様に、left joinとgroupbyを使って、数を数えずに合計を取ることができます。より多くのための構造が必要です... – JTheDev

+0

申し訳ありませんが、カウントも同じ動作します。 Sumは単なる別の方法です。しかし、関係はとにかく適切でなければなりません... – JTheDev

+0

@JTheDevはテーブル構造 –

答えて

0

一つの問題があるテーブルに関する追加情報です。私たちがそれぞれの好きなものを一意に識別できるlikeテーブルの主キーを指定する必要があります。私はpk_like_idと考えています。次に、以下のクエリを適用します。私は、同じテーブル内のvideoIdがビデオテーブルを参照する外部キーであると仮定します。 Video::、私はビデオモデルクラスを指定するために使用しました。日付比較は、あなたの機能に応じて変更することができます。以下のクエリは、昨日に起こった好きなものだけを見つけます。昨日のビデオだけでなく、これを試してみて、それは私のために働いた...

Video::select('video.id', DB::raw('COUNT(like.pk_like_id) as likecount')) 
     ->leftJoin('like', 'like.videoId', '=', 'video.id') 
     ->where('like.likeDate', '>=', Carbon::now()->subDay(1)->toDateString()) 
     ->where('like.likeDate', '<', Carbon::now()->toDateString()) 
     ->groupBy('video.id') 
     ->get(); 
+0

@ドリューAdorator:任意の運...? – JTheDev

+0

ありがとうございました! –

+0

@DrewAdorador:それを聞いてうれしい...楽しむ:) – JTheDev

関連する問題