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

标签 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();

有没有一种方法可以在 eloquent 中实现这一点,我不需要计数,只需要具有最相似计数的视频的 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');
    });

最佳答案

有一个问题。您应该为like表指定一个主键,我们可以唯一地标识每个like。我将其视为 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();

关于php - Laravel:如何根据需要计算行数的关系获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39864072/

相关文章:

php - Doctrine 2 自定义 ObjectMultiCheckbox 值

php - 如果用户不接受付款,请在 5-10 分钟后取消设置 session 。 PHP

php - 在插入数据 (PHP) 中调用 bool 值的成员函数 bind_param()

laravel - Docker Web 和 api 拒绝连接

php - 在 phpmyadmin 中重置 ID

javascript - 如何使用 JSON 转换和传输 PHP 变量数据到 HTML 页面的 Javascript

php - 重复 key 更新后插入进程

c# - 使用odbc更新asp.net c#和Mysql中的查询问题

当我尝试上传 ai 或 psd 文件时,Laravel 图像验证不起作用

php - 如何在 Laravel 5 中处理 PDOException