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

Laravel:如何筛选关联图片数≥项目类型要求数量的项目

问题与解决方案

模型关联结构

  • Project 与 ProjectGallery 为一对一关联:
public function project_gallery(){
    return $this->hasOne(ProjectGallery::class);
}
  • ProjectGallery 与 GalleryImage 为一对多关联:
public function images(){
    return $this->hasMany(GalleryImage::class);
}
  • Project 属于 ProjectType(ProjectType 包含字段 num_images_required):
public function project_type(){
    return $this->belongsTo(ProjectType::class);
}

需求与问题

需要筛选出所有关联图片数量 ≥ 其所属 ProjectType 中 num_images_required 字段值的 Project。现有查询作用域使用静态数值时可正常运行,但无法将 project_type.num_images_required 字段纳入逻辑:

public function scopeimagesComplete($query){
    return $query->whereHas('project_gallery.images', null, '>=', 'project_type.num_images_required');
}

疑问:是否需要通过子查询实现?

解决方案

是的,whereHas 的第四个参数仅支持静态值,无法直接引用关联表字段做比较,必须通过子查询或关联查询实现。以下提供两种可行写法:

写法一:子查询统计图片数,结合关联表字段做筛选

use Illuminate\Support\Facades\DB;

public function scopeImagesComplete($query)
{
    return $query->join('project_types', 'projects.project_type_id', '=', 'project_types.id')
        ->addSelect([
            'image_count' => GalleryImage::selectRaw('count(*)')
                ->join('project_galleries', 'gallery_images.project_gallery_id', '=', 'project_galleries.id')
                ->whereColumn('project_galleries.project_id', 'projects.id')
        ])
        ->havingRaw('image_count >= project_types.num_images_required');
}

写法二:使用 EXISTS 子查询做判断

use Illuminate\Support\Facades\DB;

public function scopeImagesComplete($query)
{
    return $query->join('project_types', 'projects.project_type_id', '=', 'project_types.id')
        ->whereExists(function ($subquery) {
            $subquery->select(DB::raw(1))
                ->from('project_galleries')
                ->join('gallery_images', 'project_galleries.id', '=', 'gallery_images.project_gallery_id')
                ->whereColumn('project_galleries.project_id', 'projects.id')
                ->groupBy('project_galleries.id')
                ->havingRaw('count(gallery_images.id) >= project_types.num_images_required');
        });
}

说明

两种写法都是先关联 project_types 表获取图片数量要求,再通过子查询统计每个 Project 关联的图片总数,最终筛选出数量达标的数据。写法一通过 addSelect 显式统计图片数,可读性更强;写法二利用 EXISTS 子查询,仅判断是否存在符合条件的关联数据,性能上略有优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:17:30