根据账户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]); }
代码逻辑说明
- 账户存在性校验:先判断目标账户是否有效,避免后续逻辑出现空指针异常
- 统一基础查询:先锁定该账户下所有未被订阅的Profiles,用
whereDoesntHave替代循环判断count() == 0,把过滤逻辑放到数据库层,性能更优 - 分支条件筛选:
- 若账户是
complete类型:直接返回该账户下所有未订阅Profiles - 若账户是
profile类型:额外添加user_id匹配当前认证用户的条件
- 若账户是
- 极简返回:最终把符合条件的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




