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

Laravel控制器返回视图传递筛选数据失败,请求技术解决方案

问题分析与解决方案

核心问题1:未执行数据库查询

你当前控制器中传递给视图的$worker是查询构建器实例,而非实际的数据集合。原来的代码里return $worker->get()能获取数据,是因为get()方法执行了查询并返回集合,但改成返回视图时,你直接把未执行的查询构建器传过去了,视图无法遍历这个对象。

核心问题2:循环变量名冲突

视图里的@foreach ($worker as $worker)会导致变量覆盖——循环内部的$worker会替换掉外部的集合变量,后续访问$worker->avatar等属性时,第一次循环后$worker变成单个模型实例,第二次循环就会出现逻辑错误。


修复步骤

1. 修正控制器代码,执行查询并传递正确集合

先执行查询获取数据集合,用不同的变量名(比如$workers)存储,再传递给视图:

public function aerospace(Request $request , Worker $worker ){ 
    $query = $worker->newQuery(); 

    if ($request->has('profession')) { 
        $query->where('profession', $request->input('profession')); 
    } 
    if ($request->has('state')) { 
        $query->where('state', $request->input('state')); 
    } 
    if ($request->has('local_govt')) { 
        $query->where('local_govt', $request->input('local_govt')); 
    } 

    // 执行查询拿到实际数据集合
    $workers = $query->get();
    // 把集合传递到视图
    return view ('sub-domain', ['workers' => $workers ]); 
}

2. 修正视图的循环变量名

修改循环的变量名,避免和集合变量冲突:

<div class="row">
    @foreach ($workers as $worker)
        <div class="col-lg-3 col-md-6">
            <div class="member">
                <div class="pic"><img src="{{ asset('avatar/' . $worker->avatar) }}" alt="{{ $worker->name }}"></div>
                <div class="details">
                    <h4>{{ $worker->name }} {{ $worker->l_name }}</h4>
                    <span>{{ $worker->profession }}</span><br>
                    {{ $worker->state }}
                </div>
            </div>
        </div>
    @endforeach
</div>

额外优化:用asset()辅助函数生成图片URL,能避免因站点根目录变化导致的路径错误。


更优雅的筛选实现方式

你可以用Laravel的when()方法简化重复的if判断,让代码更简洁易读:

public function aerospace(Request $request, Worker $worker)
{
    $workers = $worker->when($request->input('profession'), function ($query) use ($request) {
        return $query->where('profession', $request->input('profession'));
    })
    ->when($request->input('state'), function ($query) use ($request) {
        return $query->where('state', $request->input('state'));
    })
    ->when($request->input('local_govt'), function ($query) use ($request) {
        return $query->where('local_govt', $request->input('local_govt'));
    })
    ->get();

    return view('sub-domain', ['workers' => $workers]);
}

when()方法会在第一个参数为真时执行闭包里的查询逻辑,省去了重复的has()判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:40:38