При попытке обновить запись в БД выдается исключение «Не удалось найти четырехзначный год. Данные отсутствуют» - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над созданием приложения CRUD в Laravel, я использую столбцы default_at и updated_at по умолчанию, которые, похоже, заполняются автоматически при вставке или обновлении базы данных. При переходе от использования идентификатора отредактированной записи к извлечению фактической записи модели в качестве параметра в моем методе обновления я наткнулся на исключение "InvalidArgumentException Не удалось найти четырехзначный год. Данные отсутствуют "при вызове $ installer-> update (['my field 1', ...]);

Я пытался dd'ing мой запрос и объект $ installer, который извлекается, и все выглядит правильно, но обновление таким образом, кажется, прерывает обновление в поле updated_at. Ниже приведены соответствующие фрагменты:

Класс моей модели:

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?

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Ваш метод обновления неправильный

Один простой способ - попробовать что-то вроде ниже:

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');
}

надеюсь, что это полезно

0 голосов
/ 04 апреля 2019

Итак, я только что сделал синтаксическую ошибку, но решил, что оставлю это, если у кого-то возникнет похожая проблема. В моем методе обновления:

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

следует читать:

        $installer->update(request(['FirstName', 'LastName', 'Position', 'Status', 'EmpId']));
0 голосов
/ 03 апреля 2019

Вы не включаете массив в метод обновления

Должно быть что-то вроде этого:

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

Где $ request - данные из

...