You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误,需要修复该错误并实现过期物料的正常展示功能。

错误原因分析

  1. 模型字段不匹配:Matériels模型的scopeExpired作用域使用了不存在的数据库字段expires_at,实际字段名为expire。
  2. 控制器变量传递缺失:MaterielsController的report方法返回视图时未传递expiredMaterials变量,而视图依赖该变量进行循环渲染。
  3. 视图变量名错误:视图中误用$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

验证修复

  1. 运行php artisan optimize:clear清除Laravel缓存。
  2. 访问对应路由(如/materiels-expires),确认过期物料列表正常展示,无变量未定义错误。

内容的提问来源于stack exchange,提问作者user21781868

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:57:02