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

Laravel 11中$formulas未定义:搜索与计算方法共存问题排查

解决Laravel 11中搜索页面「undefined variable $formulas」错误

问题背景

在Laravel 11项目中,原本正常运行的search方法,在实现calculate方法后,访问搜索页面时触发「undefined variable $formulas」错误,报错位置为C:\xampp\htdocs\MedusaDashboard\resources\views\superadmin\search.blade.php第103行。需要让search与calculate方法正常协同运行。

错误原因分析

报错核心是搜索页面视图未接收到$formulas变量,可能触发场景:

  1. 路由配置错误:访问搜索页面的请求未正确指向SearchController@search方法,导致视图未被传递$formulas。
  2. 视图逻辑遗漏:未对$formulas变量的存在性做校验,变量未传递时直接调用方法触发报错。

解决方案

1. 检查并修正路由配置

确保搜索页面的GET请求路由正确指向SearchController@search方法,示例路由代码:

// routes/web.php
Route::get('/superadmin/search', [App\Http\Controllers\SearchController::class, 'search'])->name('search');
Route::get('/superadmin/formula/{id}', [App\Http\Controllers\SearchController::class, 'Detailformula'])->name('formula.open');
Route::post('/superadmin/calculate', [App\Http\Controllers\SearchController::class, 'calculate'])->name('calculate');

确认路由未被其他配置覆盖,且访问搜索页面时确实调用了search方法。

2. 优化视图的变量校验逻辑

修改search.blade.php,在使用$formulas前增加存在性检查,避免变量未定义时报错:

@if(request()->has('query') && !empty(request()->input('query')))
    <h2>搜索结果:配方</h2>
    <br>
    @if(isset($formulas) && $formulas->isEmpty())
        <p>未找到匹配的配方。</p>
    @elseif(isset($formulas))
        <div class="row gy-4" id="search-results">
            @foreach($formulas as $formula)
                <a class="search-item" href="{{ route('formula.open', ['id' => $formula->id]) }}">
                    <p>{{ $formula->warna->kode_warna }} / {{ $formula->warna->nama_warna }}</p>
                    <p>{{ $formula->mobil->merek }} {{ $formula->mobil->model }}</p>
                    <p>{{ $formula->varian }}</p>
                </a>
            @endforeach
        </div>
    @endif
@endif

3. 修正控制器查询逻辑(可选但推荐)

原search方法中的多条件查询存在逻辑优先级问题,多个orWhereHas可能导致不符合预期的结果,将所有查询条件包裹在闭包中统一处理:

public function search(Request $request)
{
    $query = $request->input('query');

    $formulas = Formula::where(function($q) use ($query){
        // 合并warna表的两个查询条件
        $q->whereHas('warna', function($subq) use ($query){
            $subq->where('kode_warna', 'like', "%$query%")
                 ->orWhere('nama_warna', 'like', "%$query%");
        })
        ->orWhere('varian', 'like', "%$query%")
        ->orWhereHas('user', function($subq) use ($query) {
            $subq->where('name', 'like', "%$query%");
        })
        ->orWhereHas('mobil', function($subq) use ($query) {
            $subq->where('merek', 'like', "%$query%");
        });
    })->get();

    return view('superadmin.search', compact('formulas'));
}

4. 修正Detailformula方法的空数据判断

原方法中使用if (!$detailFormula)无法正确判断集合是否为空,改为集合的isEmpty()方法:

public function Detailformula($id)
{
    $detailFormula = DetailFormula::where('idformula', $id)->get();

    if ($detailFormula->isEmpty()) {
        abort(404, '配方详情未找到');
    }

    return view('superadmin.formulaSA', compact('detailFormula'));
}

验证步骤

  1. 清空浏览器缓存,访问搜索页面,确认错误消失。
  2. 输入搜索关键词,验证搜索结果正常显示。
  3. 点击搜索结果进入配方详情页,测试计算功能是否正常运行。

内容的提问来源于stack exchange,提问作者Bisma Arumsyah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:40:56