You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取浏览量超100的Laravel Image Collection(关联images与views表)

嘿,这个问题我太熟了!在Laravel里处理这种多态关联的统计查询,有几种很顺手的实现方式,我给你拆解一下:

方法一:利用Eloquent关联约束直接查询

首先得确保你的Image模型已经正确定义了和View模型的多态关联。根据你的表结构,应该是一个图片对应一条浏览统计记录,所以关联方法可以这么写:

// app/Models/Image.php
public function views()
{
    // morphOne 对应一对一的多态关联,因为每个image对应一条views记录
    return $this->morphOne(View::class, 'viewable');
}

接下来,用whereHas方法筛选出关联浏览量超过100的图片,直接就能得到Laravel Collection:

$popularImages = Image::whereHas('views', function ($query) {
    $query->where('count', '>', 100);
})->get();

这个方法的好处是完全遵循Eloquent的关联逻辑,代码可读性很高,后续扩展也方便。

方法二:通过表关联查询(适合需要同时获取浏览量数据)

如果想在获取图片的同时,把对应的浏览量也一起查出来,可以用join直接关联两张表:

use App\Models\Image;

$popularImages = Image::join('views', function ($join) {
    $join->on('images.id', '=', 'views.viewable_id')
         // 这里用Image::class确保类名正确,避免硬编码
         ->where('views.viewable_type', '=', Image::class);
})->where('views.count', '>', 100)
  // 可选:把浏览量重命名后一起返回
  ->select('images.*', 'views.count as view_count')
  ->get();

这样返回的Collection里,每个Image实例都会带上view_count属性,方便直接使用。

额外说明:如果views是多记录累计的情况

要是你的views表是每次浏览新增一条记录(count字段为1,需要求和得到总浏览量),那模型关联要改成morphMany,查询方式也需要调整:

// Image模型里的关联改成一对多
public function views()
{
    return $this->morphMany(View::class, 'viewable');
}

// 查询总浏览量超过100的图片
$popularImages = Image::withCount(['views as total_views' => function ($query) {
    $query->select(DB::raw('sum(count)'));
}])->having('total_views', '>', 100)->get();

内容的提问来源于stack exchange,提问作者Timothy Kimemia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:14:45