Laravel新手提问:如何使用with函数设置where条件?
在Laravel中给
with添加where条件的实现方法 针对你想在Laravel的with方法中关联查询时添加where条件的需求,这里提供两种常用实现方式,结合你的现有代码给出修改示例:
1. 过滤关联模型的返回数据
如果希望加载account关联时,只获取满足特定条件的关联记录(主模型User仍会全部返回,只是不符合条件的account会为空),可以在with中传入闭包:
比如要筛选account表中kyc_status为rejected的记录,代码修改如下:
$users = User::with(['account' => function ($query) { // 这里写入关联模型的where条件 $query->where('kyc_status', 'rejected'); }])->orderBy('created_at', 'desc');
2. 过滤主模型(仅保留有符合条件关联的User)
如果只想查询存在符合条件的account的User,需要用whereHas方法,它会直接过滤掉没有满足条件关联的主模型:
$users = User::with('account') ->whereHas('account', function ($query) { // 关联模型的筛选条件 $query->where('kyc_status', 'rejected'); }) ->orderBy('created_at', 'desc');
结合你的现有代码的完整示例
示例一:加载符合条件的account,保留所有User
public function rejectedkyc(Request $request) { $sort_search = null; $users = User::with(['account' => function ($query) { $query->where('kyc_status', 'rejected'); // 替换为你的account表条件 }])->orderBy('created_at', 'desc'); if (!empty($request->search)) { $sort_search = $request->search; $users->where(function ($q) use ($sort_search) { $q->where('name', 'like', '%' . $sort_search . '%') ->orWhere('email', 'like', '%' . $sort_search . '%') ->orWhere('phone', 'like', '%' . $sort_search . '%') ->orWhere('referral_code', 'like', '%' . $sort_search . '%') ->orWhere('username', 'like', '%' . $sort_search . '%'); }); } $user_type = null; if (!empty($request->user_type)) { $user_type = $request->user_type; $users->where('user_type', 'like', '%' . $user_type . '%'); // 单个条件无需额外闭包 } $users = $users->paginate(15); return view('backend.customer.customers.pending', compact('users', 'sort_search', 'user_type')); }
示例二:仅保留有符合条件account的User
public function rejectedkyc(Request $request) { $sort_search = null; $users = User::with('account') ->whereHas('account', function ($query) { $query->where('kyc_status', 'rejected'); // 关联模型筛选条件 }) ->orderBy('created_at', 'desc'); if (!empty($request->search)) { $sort_search = $request->search; $users->where(function ($q) use ($sort_search) { $q->where('name', 'like', '%' . $sort_search . '%') ->orWhere('email', 'like', '%' . $sort_search . '%') ->orWhere('phone', 'like', '%' . $sort_search . '%') ->orWhere('referral_code', 'like', '%' . $sort_search . '%') ->orWhere('username', 'like', '%' . $sort_search . '%'); }); } $user_type = null; if (!empty($request->user_type)) { $user_type = $request->user_type; $users->where('user_type', 'like', '%' . $user_type . '%'); } $users = $users->paginate(15); return view('backend.customer.customers.pending', compact('users', 'sort_search', 'user_type')); }
额外提示
- 若要给关联模型添加多个where条件,直接在闭包内链式调用
where即可,比如$query->where('status', 'rejected')->where('verified', 0); - 原代码中
user_type的筛选无需额外嵌套闭包,单个条件直接写where更简洁
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

