
本文详解 laravel 中控制器向视图传递查询数据时因键名不匹配、数组结构错误或 blade 语法误用导致 `@foreach` 不渲染的问题,并提供安全、规范的解决方案。
在 Laravel 开发中,一个高频却易被忽视的问题是:控制器已成功执行数据库查询并获取到集合(Collection),但在 Blade 模板中使用 @foreach($businesses as $business) 却无法遍历输出——页面空白或报错 Undefined variable: businesses。这通常并非数据库查询失败,而是数据传递方式存在结构性偏差。
? 根本原因分析
你原始代码中的关键问题有三处:
-
键名冲突与嵌套过深:
$businesses['businesses'] = DB::table(...)->get(); // 创建了二维数组:['businesses' => Collection] return view('searchbusinessnew', $businesses)->with('bc');此时传递给视图的是一个以 'businesses' 为键的关联数组,而你在 Blade 中直接写 @foreach($businesses as $business),实际尝试遍历的是这个外层数组(仅含一个键),而非其内部的 Eloquent 集合。正确做法应让 $businesses 变量本身即为查询结果集合。
混用 ->with() 与数组传参,造成覆盖或无效:
->with('bc') 尝试绑定一个名为 bc 的空变量(未赋值),不仅无意义,还可能干扰数据解析逻辑。未使用 Laravel 推荐的请求对象,存在安全隐患:
直接使用 $_GET['id'] 绕过 Laravel 的请求验证与过滤机制,易引发 SQL 注入或未定义索引错误;应统一使用 $request->get() 或更安全的 $request->input()。
✅ 正确实现方式(推荐)
✅ 控制器(Controller)写法:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
public function search(Request $request)
{
// 使用 Request 对象安全获取参数(自动处理缺失键,默认返回 null)
$city = $request->input('city');
$email = $request->input('email');
$name = $request->input('name');
// 构建查询:支持部分为空时忽略该条件(可选增强)
$query = DB::table('businesses');
if ($city) $query->where('city', $city);
if ($email) $query->where('email', $email);
if ($name) $query->where('name', 'like', "%{$name}%");
$businesses = $query->get(); // ← 直接赋值为集合,非嵌套数组
return view('searchbusinessnew', [
'businesses' => $businesses // 键名与 Blade 中变量名严格一致
]);
}✅ Blade 视图(searchbusinessnew.blade.php)写法:
@if($businesses->count() > 0)
@foreach($businesses as $business)
ID: {{ $business->id }} |
Name: {{ $business->name }} |
Email: {{ $business->email }} |
City: {{ $business->city }}
@endforeach
@else
未找到匹配的企业信息。
@endif? 提示:$businesses 是 Illuminate\Support\Collection 实例,务必用 ->count() 判断是否为空,而非 count($businesses) 或 empty($businesses)(后者在 Collection 上行为不一致)。
⚠️ 注意事项与最佳实践
- 永远避免 $_GET / $_POST:Laravel 的 Request 对象提供自动过滤、验证、CSRF 保护等能力,是安全基石。
- 字段名需与数据库列名一致:如数据库中为 business_name,则应使用 $business->business_name,而非 $business->name(除非使用了 as name 别名或模型访问器)。
- 启用调试模式排查:在开发环境开启 APP_DEBUG=true,配合 dd($businesses) 查看实际传入视图的数据结构。
-
考虑使用 Eloquent Model 替代 Query Builder:更语义化、支持关系、自动类型转换:
$businesses = Business::when($city, fn($q) => $q->where('city', $city)) ->when($email, fn($q) => $q->where('email', $email)) ->when($name, fn($q) => $q->where('name', 'like', "%{$name}%")) ->get();
通过规范数据结构、统一变量命名、善用 Laravel 原生工具链,即可彻底解决“视图不显示查询结果”的困扰,让开发更稳健、可维护性更强。










