对不起标题,但最好解释一下。我们已经构建了一个内部网络应用程序,可以上传视频,您可以像Instagram一样评论和喜欢视频。后端正在使用Laravel API。每天我们都需要对昨天最喜欢的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');
}...
我知道我们可以执行下面的操作,但同时检索count和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来获取视频信息的收集。对于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 :(得分: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();