2016-10-05 49 views
0

对于标题感到抱歉,但最好解释它。我们已经构建了一个内部网络应用程序,用于上传视频,以便像Instagram一样评论和评论视频。后端使用的是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(); 

有没有办法我在我不需要计数的雄辩中,只需要最喜欢计数的视频的编号,因为我将使用编号来获取视频信息的集合。对于noob问题抱歉,只是想知道是否有任何方法可以正确有效地做到这一点,因为我们期待着一些用户。

下面是关于表的附加信息

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。就像那样,你可以用左连接和groupby来计算总数,而不是计数。需要更多的结构... – JTheDev

+0

对不起,伯爵也工作一样。总和只是另一种方法。但无论如何,关系应该是正确的...... – JTheDev

+0

@JTheDev更新了表结构的问题 –

回答

0

的一个问题是存在的。你应该为类似的表指定一个主键,我们可以唯一地识别每个喜好。我正在考虑它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