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

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;
}

关键改动点

  1. 参数改造:将原数组参数拆分为两个独立的可选命名参数,符合PHP8语法规范,调用时可直接指定参数名
  2. Group筛选逻辑优化:通过is_array()判断参数类型,数组时用whereIn实现多组筛选,字符串时用where单组筛选
  3. Property逻辑兼容:保留原有的.分隔符拆分逻辑,同时直接使用参数变量替代原数组取值,代码更简洁
  4. 空值处理:利用Laravel的when()方法自动忽略空参数,无需额外判断empty()

表结构参考

iduser_idgrouppropertyvalue
11notificationsevent_emailtrue
21onboardingwelcome_video_watchedfalse

内容的提问来源于stack exchange,提问作者M-Khawar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:08:16