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

October CMS(Laravel)关联表多条件过滤查询实现求助

搞定October CMS(Laravel)的多条件关联查询

嘿,我来帮你完成这个查询逻辑!你已经用whereHas搞定了关联artist表的slug过滤,接下来只需要加上type和material的条件,再加上排序就可以了,下面是具体步骤和完整代码:

1. 先明确参数来源

首先要确认type和material是来自GET请求参数(对应你SQL里的$_GET['type'])还是路由参数?如果是GET参数,我们用Laravel的request()助手来获取;如果是路由参数就用你原来的$this->param()。这里默认按GET参数处理,代码里会标注清楚调整方式。

2. 完整查询代码

// 获取请求参数(GET参数用request()->get,路由参数替换为$this->param('xxx'))
$type = request()->get('type');
$material = request()->get('material');
$artistSlug = $this->param('slug'); // 你原来的路由slug参数

// 构建最终查询
$this['painting'] = Painting::whereHas('artist', function($query) use ($artistSlug) {
    // 关联artist表过滤指定slug
    $query->where('artist_slug', $artistSlug);
})
// 过滤type字段(用when做条件判断,参数不存在时自动忽略该条件)
->when($type, function($query) use ($type) {
    $query->where('type', $type);
})
// 过滤material字段
->when($material, function($query) use ($material) {
    $query->where('material', $material);
})
// 按painting字段降序排序
->orderBy('painting', 'DESC')
->get();

3. 关键细节说明

  • 条件查询的灵活性:用when()方法的好处是,如果用户没有传type或material参数,这两个过滤条件会自动跳过,不会影响查询结果。如果你的业务要求三个参数必须都存在才能查询,那可以直接换成->where('type', $type)->where('material', $material)。
  • 模型关联验证:确保你的Painting模型和Artist模型的关联是正确的,比如Painting模型里的关联方法应该是:
    public function artist()
    {
        // 如果外键不是默认的`artist_id`,需要第二个参数指定,比如`return $this->belongsTo(Artist::class, 'artist_id');`
        return $this->belongsTo(Artist::class);
    }
    
  • 安全提示:一定要做参数验证!防止SQL注入和非法参数,比如在查询前加上:
    $validated = request()->validate([
        'type' => 'nullable|string|max:255',
        'material' => 'nullable|string|max:255',
    ]);
    // 之后用$validated['type']和$validated['material']来代替直接获取的参数
    

这样写出来的查询就完全匹配你想要的SQL逻辑了:关联artist表过滤slug,同时过滤type和material,最后按painting字段降序返回结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:04