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

Laravel数据库行存在性检查及视图变量未定义报错求助

Laravel数据库行存在性检查及视图变量未定义报错求助

看起来你遇到了两个核心问题——一是视图里的变量$istProj未定义,二是@forelse和@if的逻辑嵌套完全搞反了,导致数据判断和变量使用混乱。咱们一步步来解决:

先分析你的代码问题

  1. 逻辑嵌套错误:你把@forelse放在了@if ($istoric->isEmpty())里面,这意味着只有当$istoric为空时才会进入循环,但空集合根本没法遍历,逻辑完全颠倒了!
  2. 变量未定义:表单里的{{ $istProj->suma }}和{{ $istProj->data }},只有在@forelse的循环体内$istProj才是有效的变量。如果$istoric为空,或者在循环体外使用这个变量,自然会报“未定义”的错误。而且看你的表单是用来新增数据的,绑定$istProj的旧值完全没必要,应该用old()助手来保留用户输入。

修复后的完整视图代码

<div class="card-body">
    {{-- @forelse本身就包含空集合处理,不需要额外的@if判断 --}}
    @forelse ($istoric as $istProj)
        <div class="mb-3">
            <table class='table'>
                <tr class="table-row-heads">
                    <th>Id Proiect</th>
                    <th>Tip actiune </th>
                    <th>Colaborator </th>
                    <th>Suma </th>
                    <th>Data </th>
                </tr>
                <tr class="table-row-data">
                    <td>{{ $istProj->id_proiect }}</td>
                    <td>{{ $istProj->action_type }}</td>
                    <td>{{ $istProj->colaborator_id }}</td>
                    <td>{{ $istProj->suma }}</td>
                    <td>{{ $istProj->data }}</td>
                </tr>
            </table>
        </div>
    @empty
        <div class="card-body">
            <h1>Nu au fost gasite inregistrari</h1>
        </div>
    @endforelse
</div>

<form action="{{ url('/') }}" method="POST">
    @csrf
    {{-- 注意:如果是新增数据,应该去掉@method('PUT'),PUT是用于更新操作的 --}}
    @method('PUT')

    <div class="mb-3">
        <label class="form-label">Id proiect</label>
        <input type="text" class='form-control' value="{{ $proiecte->id }}" name='id_proiect' id='id_proiect' placeholder="Id proiect">
    </div>

    <div class="mb-3">
        <label class="form-label">Tip actiune</label>
        <select class="form-select" aria-label="Default select example"  name='Status_Tranzactii'>
            <option selected>Alege tipul actiunii (0 = cheltuiala, 1 = plata, 2 = incasare)</option>
            <option value="cheltuiala">0</option>
            <option value="plata">1</option>
            <option value="incasare">2</option>
        </select>
    </div>

    <div class="mb-3">
        <label class="form-label">Colaborator</label>
        <select class="form-select" aria-label="Default select example" name="Colab_id">
            <option selected>Alege colaboratorul (daca este cazul)</option>
            @foreach ($colaborator as $colaboratori)
                <option value="{{ $colaboratori->id }}">{{ $colaboratori->id }} </option>
            @endforeach
        </select>
    </div>

    <div class="mb-3">
        <label class="form-label">Suma</label>
        {{-- 用old()助手:既避免变量未定义,又能在验证失败时保留用户输入 --}}
        <input type="text" class='form-control' value="{{ old('suma') }}" name='suma' placeholder="Introduceti suma">
    </div>

    <div class="mb-3">
        <label class="form-label">Data</label>
        <input type="text" class='form-control' value="{{ old('data') }}" name='data' placeholder="Introduceti data">
    </div>

    <button type='submit' class='btn btn-primary' style="float: right;">Adauga</button>
</form>

控制器层面的注意事项

确保你在返回视图时,已经正确传递了所需变量:

public function yourControllerMethod()
{
    // 根据你的业务逻辑查询数据,比如按项目ID筛选
    $istoric = YourHistoricModel::where('id_proiect', $proiecteId)->get();
    $proiecte = ProiectModel::findOrFail($someId); // 确保$proiecte存在
    $colaborator = ColaboratorModel::all();

    return view('your-view-name', compact('istoric', 'proiecte', 'colaborator'));
}

关键修复总结

  • 移除了错误的@if ($istoric->isEmpty())嵌套,@forelse会自动处理空集合的展示
  • 表单字段用old()替代$istProj,彻底解决变量未定义问题,同时优化用户体验
  • 检查表单的@method('PUT'):如果是新增数据请删除该行,仅在更新操作时使用PUT方法

备注:内容来源于stack exchange,提问作者bigwall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:39:53