You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

根据账户sale_type分支逻辑获取对应关联资料(Profiles)的功能修复求助

根据账户sale_type分支逻辑获取对应关联资料(Profiles)的功能修复求助

问题背景

我维护的订阅系统里,账户(Account)有两种sale_type类型,对应不同的资料(Profile)筛选规则,但目前的代码只能单一支持其中一种场景:

  • 当账户sale_type = 'complete'时:需要展示该账户关联的所有未订阅Profiles
  • 当账户sale_type = 'profile'时:只能展示该账户下、且Profiles表user_id匹配当前认证用户的专属未订阅Profiles

现在的困境是:

  • 第一版函数能正常加载sale_type='complete'的账户Profiles,但完全看不到sale_type='profile'
  • 第二版函数刚好相反,能加载sale_type='profile'的,却看不到sale_type='complete'的账户Profiles

修复后的完整解决方案

我把两种场景的逻辑整合到了一起,同时优化了查询性能(避免多余的数据库请求和循环过滤):

public function getProfiles($account_id){
    // 先校验目标账户是否存在,避免空指针
    $account = Account::find($account_id);
    if (!$account) {
        return response()->json(['data' => []]);
    }

    // 初始化查询:先锁定该账户下所有未被订阅的Profiles
    $profileQuery = Profile::where('account_id', $account_id)
        ->whereDoesntHave('subscriptions') // 直接在数据库层过滤已订阅的,替代循环里的count()=0
        ->select(['id', 'name', 'pin']);

    // 根据账户的sale_type添加专属筛选条件
    if ($account->sale_type === 'profile') {
        // 仅展示当前登录用户的专属Profiles
        $profileQuery->where('user_id', Auth::user()->id);
    }

    // 执行查询并返回结果
    $data = $profileQuery->get();
    return response()->json(['data' => $data]);
}

代码逻辑说明

  1. 账户存在性校验:先判断目标账户是否有效,避免后续逻辑出现空指针异常
  2. 统一基础查询:先锁定该账户下所有未被订阅的Profiles,用whereDoesntHave替代循环判断count() == 0,把过滤逻辑放到数据库层,性能更优
  3. 分支条件筛选
    • 若账户是complete类型:直接返回该账户下所有未订阅Profiles
    • 若账户是profile类型:额外添加user_id匹配当前认证用户的条件
  4. 极简返回:最终把符合条件的Profiles直接返回,逻辑清晰且无冗余

兼容原有Helper函数的版本

如果你想继续复用项目里的getDataSelect Helper,也可以用这种写法:

public function getProfiles($account_id){
    $account = Account::find($account_id);
    if (!$account) {
        return response()->json(['data' => []]);
    }

    $attr = [
        'table' => 'profiles',
        'columns' => ['id', 'name', 'pin', 'user_id'],
        'compare' => 'account_id',
        'compare_value' => $account_id
    ];

    // 先拿到该账户下所有未订阅的Profiles
    $profiles = Helper::getDataSelect($attr)
        ->whereDoesntHave('subscriptions')
        ->get();

    // 根据sale_type过滤结果
    if ($account->sale_type === 'profile') {
        $authUserId = Auth::user()->id;
        $profiles = $profiles->filter(fn($p) => $p->user_id === $authUserId);
    }

    return response()->json(['data' => $profiles]);
}

验证场景

  • sale_type='complete'的账户:会显示该账户下所有未被订阅的Profiles
  • sale_type='profile'的账户:只会显示该账户下、属于当前登录用户的未被订阅的Profiles

备注:内容来源于stack exchange,提问作者Ricardo Guerra

火山引擎 最新活动