如何获取浏览量超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
相关产品推荐
相关产品推荐

