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
相关产品推荐
相关产品推荐

