
在 Laravel Blade 中,@foreach 内部不能直接用 @ 语法(如 @dd)前声明 PHP 变量;必须用标准 PHP 标签 显式定义变量,否则会报“Undefined variable”错误。
在 laravel blade 模板中,`@foreach` 内部不能直接用 `@` 语法(如 `@dd`)前声明 php 变量;必须用标准 php 标签 `` 显式定义变量,否则会报“undefined variable”错误。
Blade 是 Laravel 的模板引擎,它对 PHP 代码的解析有特定规则:所有以 @ 开头的指令(如 @foreach、@if、@dd)属于 Blade 编译指令,而普通 PHP 变量声明(如 $sub = ...)必须置于原生 PHP 作用域中,即 标签内。你原始代码中的写法:
@foreach($course as $year)
$sub = \App\Models\SubCourse::where('course_id',$year->id)->first();
@dd($sub->id);
@endforeach
问题在于 $sub = ... 这一行未被包裹在 中,Blade 将其视为纯文本或无效语法,导致变量 $sub 实际未被 PHP 解析器声明,后续 @dd($sub->id) 自然抛出 Undefined variable: sub 错误。
✅ 正确写法是显式使用 PHP 开始/结束标签:
@foreach($course as $year)
<?php $sub = \App\Models\SubCourse::where('course_id', $year->id)->first();
if ($sub) {
dd($sub->id); // 推荐用原生 dd(),避免 @dd 在非调试环境出错
}
?>
@endforeach
⚠️ 注意事项:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
始终检查空值:
SubCourse::first()可能返回null,直接访问->id会触发“Trying to get property 'id' of non-object”错误。务必添加if ($sub)判断; - 性能警告:该写法在循环中执行 N+1 查询(每门课程查一次子课程),严重降低性能。推荐在控制器中预加载关联数据:
// Controller — 更优方案:使用 Eloquent 关联 + with()
$course = Course::with('subCourses')->get(); // 假设 Course 模型已定义 hasMany('subCourses')
然后在视图中安全遍历:
@foreach($course as $year)
@foreach($year->subCourses as $sub)
{{ $sub->id }}
@endforeach
@endforeach
- 若无模型关联,也可用
whereIn一次性查询后映射(批量优化),避免 N+1。
总结:Blade 不允许在 @ 指令块中混写裸 PHP 变量赋值;一切动态变量操作请严格置于 内,并配合空值校验与查询优化,兼顾可读性与性能。










