【问题标题】:Trying to update a DB entry throws "A four digit year could not be found Data missing" exception尝试更新数据库条目会引发“找不到四位数年份数据丢失”异常
【发布时间】:2019-08-25 09:08:43
【问题描述】:

我正在 Laravel 中创建一个 CRUD 应用程序,我正在使用默认的 created_at 和 updated_at 列,当我插入或更新到数据库时,它们似乎会自动填充。从使用已编辑条目的 ID 更改为在我的更新方法中将实际模型条目作为参数拉入时,我偶然发现了异常“InvalidArgumentException 调用 $installer->update(['my field 1', ...]);

我已尝试 dd'ing 我的请求和被拉入的 $installer 对象,一切看起来都正确,但以这种方式更新似乎会破坏 updated_at 字段上的更新。下面是相关的sn-ps:

我的模型课:

class Installer extends Model
{
    protected $guarded = [];
}

我的更新方法:

    public function update(Installer $installer) {
        request()->validate([
            'FirstName' => 'required',
            'LastName' => 'required',
            'Position' => 'required',
            'Status' => 'required',
            'EmpId' => 'required'
        ]);
        $installer->update(['FirstName', 'LastName', 'Position', 'Status', 'EmpId']);

        return redirect('/installers');
    }

我的编辑表单的相关部分:

    <form method="POST" action="/installers/{{ $installer->id }}" style="margin-bottom: 1em">
        @method('PATCH')
        @csrf
        <div class="field">
            <label class="label" for="FirstName">First Name</label>
            <div class="control">
                <input type="text" class="input" name="FirstName" placeholder="First Name" value="{{ $installer->FirstName }}" required>
            </div>
        </div>
        <div class="field">
            <label class="label" for="LastName">Last Name</label>
            <div class="control">
                <input type="text" class="input" name="LastName" placeholder="Last Name" value="{{ $installer->LastName }}" required>
            </div>
        </div>
        <div class="field">
            <label class="label" for=Position">Position</label>
            <div class="control">
                <input type="text" class="input" name="Position" placeholder="Position" value="{{ $installer->Position }}" required>
            </div>
        </div>
        <div class="field">
            <label class="label" for="Status">Status</label>
            <div class="control">
                <input type="text" class="input" name="Status" placeholder="Status" value="{{ $installer->Status }}" required>
            </div>
        </div>
        <div class="field">
            <label class="label" for="EmpId">Employee ID</label>
            <div class="control">
                <input type="text" class="input" name="EmpId" placeholder="Employee ID" value="{{ $installer->EmpId }}" required>
            </div>
        </div>
        <div class="field">
            <div class="control">
                <button type="submit" class="button is-link">Update Installer</button>
            </div>
        </div>
    </form>

我该如何修改,以便 eloquent 继续自动更新 updated_at 字段?

【问题讨论】:

  • 该错误通常来自 Carbon 试图使用错误的日期。 var_dump($installer)Log::info($installer) 在您尝试更新之前查看它包含的内容。
  • @aynber var_dumping 安装程序只显示原始对象,而不是新请求。 var_dumping 请求不包括 created_at 日期,因为它是在事后自动添加的。我将补充一点,我在 create 方法中的 var_dump 看起来完全一样,并且工作正常。

标签: php laravel eloquent php-carbon


【解决方案1】:

更新方法中没有包含数组

必须是这样的:

$installer->update([
    'FirstName' => $request->FirstName,
    'LastName' => $lastNameVar,
    'ColName' => $colValue,
   ...
]);

其中 $request 是来自

的数据

【讨论】:

  • 是的,我犯了一个愚蠢的错误。我的更新行应该是: $installer->update(request(['FirstName', 'LastName', 'Position', 'Status', 'EmpId']));
【解决方案2】:

所以我只是犯了一个语法错误,但我想如果有人有类似的问题,我会留下这个。在我的更新方法中:

        $installer->update(['FirstName', 'LastName', 'Position', 'Status', 'EmpId']);

应改为:

        $installer->update(request(['FirstName', 'LastName', 'Position', 'Status', 'EmpId']));

【讨论】:

    【解决方案3】:

    你的更新方法不对

    一种简单的方法是尝试以下方法:

    public function update(Installer $installer) {
        $validatedData = request()->validate([
            'FirstName' => 'required',
            'LastName' => 'required',
            'Position' => 'required',
            'Status' => 'required',
            'EmpId' => 'required'
        ]);
        $installer->update($validatedData); //or $installer->update([$validatedData]);
    
        return redirect('/installers');
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 2018-05-05
      • 2017-03-24
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多