You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:57:18