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
相关产品推荐
相关产品推荐

