Laravel:如何根据需要计算行数的关系获得结果

时间:2016-10-05 01:23:47

标签: php mysql laravel

对不起标题,但最好解释一下。我们已经构建了一个内部网络应用程序,可以上传视频,您可以像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');
    });

1 个答案:

答案 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();