Laravel 9中如何用PHP8命名参数改造Scope的属性传递逻辑
改造方案:Laravel 9 Setting模型Scope适配PHP8命名参数与多Group筛选
需求说明
原Setting模型的scopeSettingFilters本地Scope原本接收包含group和property的数组参数,需做以下改造:
- 将数组参数改为PHP8命名参数,提升代码可读性
group参数支持**字符串(单组筛选)或数组(多组筛选)**两种类型- 保留原有
property参数的处理逻辑(支持group.property格式的拆分筛选)
期望调用方式:
// 单组筛选 Setting::settingFilters(group: "onboarding")->get(); // 多组筛选 Setting::settingFilters(group: ["onboarding", "notifications"])->get(); // 结合property筛选 Setting::settingFilters(property: "event_email")->get(); Setting::settingFilters(group: "notifications", property: "event_email")->get(); Setting::settingFilters(property: "notifications.event_email")->get();
改造后的Scope代码
public function scopeSettingFilters($query, string|array|null $group = null, ?string $property = null) { // 处理Group筛选:支持字符串或数组 $query->when($group, function ($q) use ($group) { if (is_array($group)) { $q->whereIn('group', $group); } else { $q->where('group', $group); } }); // 处理Property筛选:保留原有的拆分逻辑 $query->when($property, function ($q) use ($property) { if (str_contains($property, '.')) { [$groupPart, $propertyPart] = $this->splitKey($property); $q->where(['group' => $groupPart, 'property' => $propertyPart]); } else { $q->where('property', $property); } }); return $query; }
关键改动点
- 参数改造:将原数组参数拆分为两个独立的可选命名参数,符合PHP8语法规范,调用时可直接指定参数名
- Group筛选逻辑优化:通过
is_array()判断参数类型,数组时用whereIn实现多组筛选,字符串时用where单组筛选 - Property逻辑兼容:保留原有的
.分隔符拆分逻辑,同时直接使用参数变量替代原数组取值,代码更简洁 - 空值处理:利用Laravel的
when()方法自动忽略空参数,无需额外判断empty()
表结构参考
| id | user_id | group | property | value |
|---|---|---|---|---|
| 1 | 1 | notifications | event_email | true |
| 2 | 1 | onboarding | welcome_video_watched | false |
内容的提问来源于stack exchange,提问作者M-Khawar
相关产品推荐
相关产品推荐

