【问题标题】:Laravel: How to get results based on relationship that needs to count the number of rowsLaravel:如何根据需要计算行数的关系获取结果
【发布时间】:2016-10-05 01:23:47
【问题描述】:

对不起标题,但最好解释一下。我们已经构建了一个内部网络应用程序,可以上传视频,您可以在其中评论和喜欢视频,就像 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 来获取视频信息的集合。很抱歉这个菜鸟问题,只是想知道是否还有正确有效的方法,因为我们期待大量用户。

这里是关于表格的附加信息

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');
    });

【问题讨论】:

  • 你尝试过左连接的基本实现吗?如果没有,请分享视频表的表结构,如表。我的理解是,您也在根据用户跟踪喜欢。如果是这样,每个喜欢都将表示为行。在这种情况下,您可以放置​​一个名为“喜欢”的列,并在插入时将其设置为一个。像这样,您可以使用左连接和 groupby 进行总和,而不是计数。需要更多结构...
  • 对不起,count 也一样。 Sum 只是另一种方法。但无论如何,关系应该是正确的......
  • @JTheDev 用表格结构更新了问题
  • 我可以知道stage是什么,还是like表中的videoId与video表直接相关?
  • @JTheDev 抱歉更正了表格引用

标签: php mysql laravel


【解决方案1】:

有一个问题。您应该为like 表指定一个主键,我们可以唯一地识别每个likes。我认为它是pk_like_id。然后应用以下查询。我假设 like 表中的 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();

【讨论】:

  • @Drew Adorator:运气好...?
  • @DrewAdorador:很高兴听到这个消息......享受:)
猜你喜欢
  • 2014-01-09
  • 2022-01-20
  • 2018-01-11
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多