Laravel中Undefined variable $expiredMaterials错误的解决方法
修复Laravel中Undefined variable $expiredMaterials错误并实现过期物料展示
问题概述
在Laravel项目中展示用户录入的过期物料列表时,视图文件C:\Users\Fatima\Desktop\PFE\Gpi_projet\resources\views\materiels_expires.blade.php抛出Undefined variable $expiredMaterials错误,需要修复该错误并实现过期物料的正常展示功能。
错误原因分析
- 模型字段不匹配:Matériels模型的
scopeExpired作用域使用了不存在的数据库字段expires_at,实际字段名为expire。 - 控制器变量传递缺失:MaterielsController的
report方法返回视图时未传递expiredMaterials变量,而视图依赖该变量进行循环渲染。 - 视图变量名错误:视图中误用
$value变量,实际循环变量为$material;同时引用了未在模型中声明的date字段。
修复步骤
1. 修正Matériels模型代码
<?php namespace App\Models; use Illuminate\Support\Carbon; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Matériels extends Model { protected $table = 'Matériels'; use HasFactory; // 用$casts规范声明日期字段类型 protected $casts = [ 'expire' => 'datetime', 'dis' => 'datetime', ]; protected $fillable = [ 'type', 'série', 'marque', 'réfference', 'service', 'status', 'dis', 'expire', 'date', // 若数据库存在date字段,添加到可填充列表 ]; protected static function boot() { parent::boot(); static::creating(function ($model) { $model->expire = Carbon::parse(request()->input('expire')); }); static::updating(function ($model) { // 移除冗余的save()调用,updating钩子会自动保存修改 if ($model->expire->isPast()) { $model->status = 'expiré'; } }); } // 修正作用域方法,使用正确的数据库字段名expire public function scopeExpired($query) { return $query->whereNotNull('expire') ->where('expire', '<=', now()) ->where('status', '=', 'expiré'); } }
2. 修正MaterielsController代码
确保所有返回materiels_expires视图的方法都传递expiredMaterials变量:
<?php namespace App\Http\Controllers; use App\Models\Matériels; use Illuminate\Http\Request; use Auth; use DB; class MaterielsController extends Controller { public function index() { $expiredMaterials = Matériels::expired()->get(); return view('materiels_expires', compact('expiredMaterials')); } public function report(Request $request) { if (Auth::guest()) { // 替换为项目中正确的登录路由名 return redirect()->route('login'); } $fromdate = $request->fromdate; $todate = $request->todate; $name = $request->name; $data = DB::table('Matériels') ->where('date', '>=', $fromdate . ' 00:00:00') ->where('date', '<=', $todate . ' 23:59:59') ->where('série', 'like', '%' . $name . '%') ->orderBy('date', 'desc') ->get(); $latestEntry = Matériels::latest()->first(); // 添加过期物料数据传递 $expiredMaterials = Matériels::expired()->get(); return view('materiels_expires', compact('data', 'latestEntry', 'expiredMaterials')); } }
同时确认路由配置正确,例如在routes/web.php中:
Route::get('/materiels-expires', [\App\Http\Controllers\MaterielsController::class, 'index'])->name('materiels.expires'); Route::get('/materiels-report', [\App\Http\Controllers\MaterielsController::class, 'report'])->name('materiels.report');
3. 修正视图代码
修复变量名错误,使用正确字段名并添加空值保护:
@foreach($expiredMaterials as $material) <tr> <td class="id">{{ $material->id }}</td> <td class="type">{{ $material->type }}</td> <td class="série">{{ $material->série }}</td> <td class="marque">{{ $material->marque }}</td> <td class="réfference">{{ $material->réfference }}</td> <td class="service">{{ $material->service }}</td> <!-- 空值保护避免字段为null时报错 --> <td class="date">{{ $material->date?->format('Y-m-d H:i:s') }}</td> <!-- 使用正确的expire字段 --> <td class="date">{{ $material->expire->format('Y-m-d H:i:s') }}</td> <td class="status">{{ $material->status }}</td> <td class="text-center"> <a class="m-r-15 text-muted update" data-toggle="modal" data-id="{{ $material->id }}" data-target="#update"> <i class="fa fa-edit" style="color: #2196f3"></i> </a> <a href="{{ url('form/delete'.$material->id) }}" onclick="return confirm('Voulez-vous le supprimé?')"> <i class="fa fa-trash" style="color: red;"></i> </a> </td> </tr> @endforeach
验证修复
- 运行
php artisan optimize:clear清除Laravel缓存。 - 访问对应路由(如
/materiels-expires),确认过期物料列表正常展示,无变量未定义错误。
内容的提问来源于stack exchange,提问作者user21781868
相关产品推荐
相关产品推荐

