Как обновить данные в laravel

У меня проблемы с обновлением записей в моей базе данных с помощью laravel. Я хочу, чтобы пользователь мог изменить свое имя/адрес электронной почты, заполнив форму. однако это не работает. это дает мне эту ошибку «Создание объекта по умолчанию из пустого значения», и я понятия не имею, что я делаю неправильно. Я надеюсь, что кто-то может помочь мне с этой проблемой.

Моя функция обновления в моем контроллере:

public function update(Request $request, $id)
{
    $user = UserModel::find($id);

    $name->name = $request->input('name');
    $email->email = $request->input('email');

    $user->save();

    return view('edit');
}

Моя форма на мой взгляд:

 <form id="form" action="{{ action('AccountController@update') }}">
    @csrf
        <div class="form-group">
            <h5>Edit Acount info</h5>
            <label for="">Name:</label><input name="name" type="text" value="{{ Auth::user()->name }}" class="form-control" id="edit_name">
            <label for="">E-mail:</label><input name="email" type="text" value="{{ Auth::user()->email }}" class="form-control" id="edit_email">
            <button type="submit" class="btn btn-primary"><a id="btn_link">Edit</a></button>
        </div>
 </form>

Моя модель:

 class UserModel extends Model
 {
   protected $table = 'users';
   protected $primarykey = 'id';
   protected $fillable = ['name', 'email'];
 }   

введите здесь описание изображения


person stefan de boer    schedule 13.01.2019    source источник
comment
Я изменил свой ответ, чтобы также включить изменения для преобразования вашего запроса в POST :)   -  person Mozammil    schedule 13.01.2019


Ответы (2)


Вы пытаетесь присвоить значение объекту name и email. Оба не существуют. Вы, вероятно, хотели сделать это:

public function update(Request $request)
{
    auth()->user()->update([
        'name'  => $request->input('name'),
        'email' => $request->input('email')
    ]);

    return view('edit');
}

Редактировать: по общему признанию, довольно странно видеть действие обновления, выполняемое с помощью GET. Я бы изменил его на POST. Также изменено действие для использования именованного маршрута. Вы можете сохранить своего помощника действий, если хотите.

<form id="form" action="{{ route('account.update') }}" method="POST">
    @csrf
        <div class="form-group">
            <h5>Edit Account info</h5>
            <label for="">Name:</label><input name="name" type="text" value="{{ auth()->user()->name }}" class="form-control" id="edit_name">
            <label for="">E-mail:</label><input name="email" type="text" value="{{ auth()->user()->email }}" class="form-control" id="edit_email">
            <button type="submit" class="btn btn-primary"><a id="btn_link">Edit</a></button>
        </div>
 </form>

Убедитесь, что ваш маршрут также изменен на POST, если это еще не так.

Route::post('account/update', 'AccountController@update')->name('account.update');

Не уверен, что это ваш реальный маршрут, но вы можете легко изменить его :)

person Mozammil    schedule 13.01.2019
comment
@Mozamil Я попробовал код, который вы мне предоставили. Я также изменил свой текущий маршрут на почтовый маршрут. Он все еще не работает, он продолжает говорить мне, что значения равны нулю, и я понятия не имею, почему имя и адрес электронной почты являются нулевыми значениями. - person stefan de boer; 13.01.2019
comment
не могли бы вы dd(auth()->user()) в контроллере? - person Mozammil; 13.01.2019
comment
Извините, я имел в виду dd(auth()->user->name, auth()->user()->email)); - person Mozammil; 13.01.2019
comment
Я попробовал dd(auth()-›user-›name, auth()-›user()-›email)); и он возвращает правильные данные. - person stefan de boer; 13.01.2019
comment
Выполнены некоторые обновления кода контроллера и блейд-файла, включая маршрут. Я немного упростил. Он должен работать. - person Mozammil; 13.01.2019

Посмотрите на свою ошибку, она должна работать:

public function update(Request $request, $id)
{
    $user = UserModel::find($id);

    $user->name = $request->input('name');
    $user->email = $request->input('email');

    $user->save();

    return view('edit');
}

Это тоже способ:

public function update(Request $request, $id)
{
    $user = UserModel::find($id);

    $user->update([
        'name' => $request->input('name'),
        'email' => $request->input('email')
    ]);

    return view('edit');
}
person MyLibary    schedule 13.01.2019
comment
Я пытался использовать последний метод, но он все еще дает мне ошибки. На этот раз он сообщает мне об этом «SQLSTATE [23000]: нарушение ограничения целостности: 1048 имя столбца не может быть нулевым». Но я не понимаю, почему имя пустое. - person stefan de boer; 13.01.2019
comment
dd($request-›all()) — что вы видите в запросе? - person MyLibary; 13.01.2019
comment
Когда я делаю dd($request-›all()); я не вижу никаких данных в запросе. - person stefan de boer; 13.01.2019
comment
Стоит отметить, что ваше обновление является GET запросом. - person Mozammil; 13.01.2019
comment
@Mozammil, где мне изменить это на POST? - person stefan de boer; 13.01.2019
comment
Я имею в виду, что в этом нет необходимости, если ваш маршрут является GET, но это довольно странно для действия обновления. - person Mozammil; 13.01.2019
comment
@stefandeboer в объявлении вашей формы нет method="post", поэтому по умолчанию будет использоваться get. Это означает, что любой может выполнять действия по обновлению, просто имея URL-адрес. Вы можете изменить на `PUT', см.: laravel.com/docs/5.4/routing #form-method-spoofing Это означает, что вы должны изменить объявление маршрута на метод, который вы используете. - person Oluwatobi Samuel Omisakin; 14.01.2019