Laravel多模型搜索返回数组结果无法在视图中正确读取求助
跨模型搜索结果读取问题修复
原代码存在的问题
- 循环查询
Rawson模型时,每次循环都会覆盖$res2变量,最终只会保留最后一次查询的结果,丢失其他匹配数据 - 最终组装的
$digits是二层结构数组:第一个元素是Rawson的查询结果集合,第二个元素是Registro的查询结果集合,视图循环时第一层拿到的是整个集合对象,无法直接读取id、cliente等模型属性 - 搜索逻辑不完整:
Rawson模型的查询条件是匹配Registro查到的客户名,没有直接对搜索关键词做匹配,不属于真正的跨表并行搜索
修正后的实现代码
控制器方法修正
public function search(Request $request){ $keyword = $request->search; // 分别查询两个模型中匹配关键词的结果 $registroResults = Registro::where('cliente', 'LIKE', "%{$keyword}%")->get(); $rawsonResults = Rawson::where('cliente', 'LIKE', "%{$keyword}%")->get(); // 合并两个结果集合为一维集合,concat不会因主键重复覆盖数据 $digits = $registroResults->concat($rawsonResults); return view('posts.results', compact('digits'))->with(['search' => $keyword]); }
如果需要区分结果来自哪个模型,可以在查询时给每个结果追加来源标识:
$registroResults = Registro::where('cliente', 'LIKE', "%{$keyword}%") ->get() ->map(fn($item) => $item->setAttribute('source', 'Registro')); $rawsonResults = Rawson::where('cliente', 'LIKE', "%{$keyword}%") ->get() ->map(fn($item) => $item->setAttribute('source', 'Rawson'));
视图代码说明
修正控制器后,$digits是由单个模型实例组成的集合,原有循环逻辑可以直接正常运行,不需要额外调整。如果加了来源标识,可以按需做差异化渲染,比如不同来源的链接跳转到不同地址:
<ul class="list-unstyled w-100"> @forelse ($digits as $post) <li> <a href="#" class="post-link" data-id="{{ $post->id }}" data-source="{{ $post->source ?? '' }}"> {{ $post->cliente }} </a> </li> @empty <li><a href="#" data-id="0">No hay resultados disponibles "{{ $search }}"</a></li> @endforelse </ul>
内容的提问来源于stack exchange,提问作者Jeremias Rosas
相关产品推荐
相关产品推荐

