本文详解 laravel 中控制器向 blade 视图传递数据的常见错误及修复方法,重点解决因变量名不匹配导致数据无法渲染的问题,并提供完整可运行的代码示例与最佳实践建议。
本文详解 laravel 中控制器向 blade 视图传递数据的常见错误及修复方法,重点解决因变量名不匹配导致数据无法渲染的问题,并提供完整可运行的代码示例与最佳实践建议。
在 Laravel 开发中,一个高频问题就是:数据库已成功填充数据(无论是通过 Seeder 还是 phpMyAdmin),控制器也正确执行了模型查询,但 Blade 模板却始终空白或仅显示表头——这往往并非数据库或路由问题,而是
视图变量绑定与引用不一致
所致。
以你的代码为例,控制器中使用:
这意味着你将查询结果赋值给了视图变量 vacatures(注意拼写为 vacatures,复数形式),而 Blade 中却误用了未定义的 $data 变量进行判空:
由于 $data 从未被传入视图,isset($data) 恒为 false,整个 @foreach 循环被跳过,表格体为空——这就是“只显示表头”的根本原因。
✅ 正确做法是:
确保 @if 判空与 @foreach 遍历使用完全相同的变量名
。修改 Blade 中的判断逻辑为:
? 补充说明:
使用 $vacatures->isNotEmpty() 替代 isset($vacatures) 更加健壮——它既可处理 null,也能准确识别空集合(如 Collection::make([]));
Blade 中应使用对象属性访问语法($vacature->id)而非数组语法($vacature['id']),因为 Eloquent 返回的是模型实例,非原生数组(除非显式调用 toArray());
若需调试变量内容,可在 Blade 中临时添加 {{ dd($vacatures) }} 查看实际传入结构。
此外,请确认以下关键点无误:
路由指向正确控制器方法:Route::get('list', [Vacatures::class, 'show']); ✅
控制器方法名与路由注册一致(当前为 show,非 viewLoad);
模型 Vacature 已正确定义,且数据库表名符合 Laravel 约定(如 vacatures)或已通过 $table 属性显式指定。
最后,推荐采用 Laravel 的
资源控制器
与
命名路由
提升可维护性:
这样不仅结构清晰,也便于后续扩展分页、搜索等功能。记住:
变量名一致性是 Blade 渲染成功的前提,也是 Laravel 数据流中最易忽视却最关键的细节之一。
$data = Vacature::all();
return view('list', ['vacatures' => $data]);@if(isset($data)) {{-- ❌ 错误:$data 在视图中并不存在 --}}
@foreach($vacatures as $vacature)
...
@endforeach
@endif
ID
Bedrijven ID
Body
Created At
Updated At
Action
@if($vacatures->isNotEmpty()) {{-- ✅ 推荐:用集合方法判空,更语义化且安全 --}}
@foreach($vacatures as $vacature)
{{ $vacature->id }}
{{ $vacature->bedrijven_id }}
{{ $vacature->body }}
{{ $vacature->created_at }}
{{ $vacature->updated_at }}
@endforeach
@else
Geen vacatures gevonden.
@endif
// routes/web.php
Route::resource('vacatures', VacaturesController::class)->only(['index']);// app/Http/Controllers/VacaturesController.php
public function index()
{
return view('vacatures.index', [
'vacatures' => Vacature::latest()->get()
]);
}