Laravel嵌套关联搜索:实现双关联字段匹配$request->search
完善双关联字段的搜索查询
没问题,我帮你把这段Laravel查询代码完善好,核心要注意的是查询条件的分组逻辑,不然很容易出现不符合预期的结果。
原代码的问题
你原来的写法直接用了orWhereHas,这会让where('accepter_id', Auth::user()->id)和后面的两个关联搜索条件变成「或」的关系——也就是说,会把不属于当前用户的连接也查出来,只要它们的link或company匹配关键词,这显然不是你想要的。
修复后的完整代码
我们需要把两个关联的搜索条件包裹在一个where闭包里,确保逻辑是:当前用户的连接,并且(link匹配关键词 或 company匹配关键词)。代码如下:
$clients = \App\AcceptedConnection::with('requester.link', 'requester.company') ->where('accepter_id', Auth::user()->id) ->where(function ($query) use ($request) { // 两个关联的搜索条件放在这里,形成内部的「或」逻辑 $query->orWhereHas('requester.link', function ($linkQuery) use ($request) { // 这里用like做模糊匹配,支持部分关键词搜索,精确匹配可以去掉% $linkQuery->where('name', 'like', "%{$request->search}%"); }) ->orWhereHas('requester.company', function ($companyQuery) use ($request) { // 这里假设你要匹配company的name字段,根据你的实际数据库字段调整 $companyQuery->where('name', 'like', "%{$request->search}%"); }); }) ->get();
额外优化:处理空搜索的情况
如果用户没有输入搜索关键词,上面的代码会返回空结果,这显然不合理。可以加个判断,只有当搜索关键词存在时才添加搜索条件:
// 先构建基础查询:当前用户的所有AcceptedConnection $clientsQuery = \App\AcceptedConnection::with('requester.link', 'requester.company') ->where('accepter_id', Auth::user()->id); // 只有当搜索关键词不为空时,才添加关联搜索条件 if ($request->filled('search')) { $clientsQuery->where(function ($query) use ($request) { $query->orWhereHas('requester.link', function ($linkQuery) use ($request) { $linkQuery->where('name', 'like', "%{$request->search}%"); }) ->orWhereHas('requester.company', function ($companyQuery) use ($request) { $companyQuery->where('name', 'like', "%{$request->search}%"); }); }); } // 执行查询 $clients = $clientsQuery->get();
注意事项
- 调整
requester.company的查询字段:我假设你要匹配的是name字段,如果你的表字段是company_name或者其他名称,记得改成对应的字段。 - 模糊匹配 vs 精确匹配:如果你需要精确匹配关键词,把
like "%{$request->search}%"改成= $request->search即可。
内容的提问来源于stack exchange,提问作者Dip
相关产品推荐
相关产品推荐

