Laravel实现标题子串搜索功能时搜索后无结果问题排查
问题原因
- 核心错误:字段名大小写不匹配。控制器的搜索逻辑中读取的是
$post->titel(首字母小写),但Blade模板渲染标题用的是$post->Titel(首字母大写),Laravel模型属性严格区分大小写,控制器读取的小写字段不存在,始终返回空值,导致所有过滤条件都不满足,最终返回空结果。 - 逻辑缺陷:搜索表单放在
@foreach循环内部,每渲染一条帖子就生成一个搜索框,不符合页面逻辑,也容易引发参数提交异常。 - 性能隐患:先全量查询所有帖子再用集合过滤,数据量超过百级就会出现明显性能损耗,完全可以用SQL查询直接完成过滤。
解决方案
1. 修正控制器搜索逻辑
建议优先改为SQL查询,既解决字段匹配问题,也优化性能,代码如下:
class PostController extends Controller { public function index(Request $request) { $postsQuery = Post::query(); if($request->has('s')) { $query = strtolower($request->get('s')); // 使用SQL的lower函数兼容大小写匹配 $postsQuery->whereRaw('LOWER(Titel) LIKE ?', ["%{$query}%"]); } $posts = $postsQuery->get(); return view('posts.overview', compact('posts')); } }
如果坚持使用集合过滤,只需将控制器中$post->titel修改为$post->Titel即可解决搜索无结果问题。
2. 修正Blade模板结构
将搜索表单移出@foreach循环,避免重复生成搜索框,修正后代码如下:
@extends('layouts.app') @section('content') <style> .container { display: flex; justify-content: center; align-items: center; } </style> <div class="flex justify-center"> <div class="w-11/12 bg-gray-400 p-6 rounded-lg font-serif text-4xl font-bold bg-opacity-70 subpixel-antialiased tracking-wide not-italic"> <h1 class="flex justify-center mb-10"> Übersicht der Stellenanzeigen </h1> <!-- 搜索表单移至循环外部 --> <form class="mb-5 flex w-full justify-center items-end" action="{{ route('overview') }}" method="get"> <div class="relative mr-4 w-full lg:w-1/2 text-left"> <input type="text" id="s" name="s" value="{{ request()->get('s') }}" class="w-full bg-gray-100 bg-opacity-50 rounded focus:ring-2 focus:ring-indigo-200 focus:bg-transparent border border-gray-300 focus:border-indigo-500 text-base outline-none text-gray-700 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out"> </div> <button class="text-white px-4 py-3 rounded text-base font-medium bg-gradient-to-r from-green-400 to-blue-500 float-right shadow transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100">Suchen</button> </form> @foreach($posts as $post) <div class="p-10 grid-cols-3 grid-rows-3 gap-4 shadow-2xl mb-10 bg-gradient-to-r from-green-400 to-blue-500 border-solid border-2 border-black rounded-lg"> <!-- 帖子卡片 --> <a href="{{ 'bewerben' }}"> <div class="overflow-hidden row-span-3 bg-gray-100 shadow-2xl border-solid border-2 border-gray-500 rounded-lg"> <div class="pt-2 pl-6 mt-3">{{ $post->Titel }}</div> <div class="px-6 py-4 mt-2 ring-4 ring-opacity-90"> <button type="button" class="text-white px-4 py-3 rounded text-base font-medium bg-gradient-to-r from-green-400 to-blue-500 float-right shadow transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100" onclick="window.location='{{ url('bewerben') }}'">Direkt bewerben!</button> <div class="pt-2 pl-4 font-medium text-base font-bold font-serif"> Standort: {{ $post->Standort }}</div> <div class="pt-2 pl-4 font-medium text-base font-bold font-serif"> Kontakt: {{ $post->Kontakt }}</div> <button type="button" class="text-white px-4 py-3 rounded text-base font-medium bg-gradient-to-r from-green-400 to-blue-500 float-right shadow transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-100">Details!</button> <div class="pt-2 pl-4 font-medium text-base font-bold font-serif"> Startdatum: {{ $post->startdate }}</div> <div class="pt-2 pl-4 font-medium text-base font-bold font-serif"> Enddatum: {{ $post->enddate }}</div> <div class="px-6 pt-4 pb-2"></div> </div> </div> </a> </div> @endforeach </div> </div> @endsection
内容的提问来源于stack exchange,提问作者Frevelman
相关产品推荐
相关产品推荐

