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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:36:02