Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

rdiyto's avatar

Cannot update user

I just created a user edit page, but when I submit it doesn't change.

This is my link to edit:

<a href="{{route('userEdit', $user->id)}}" class="text-primary"><i class="fa fa-edit"></i></a>

This is my route:

Route::group(['prefix' => 'admin/', 'middleware' => ['role:developer|admin']], function()
{
    Route::get('dashboard', 'AdminController@dashboard')->name('adminDashboard');

    Route::get('manage/user/index', 'AdminController@userIndex')->name('userIndex');
    Route::get('manage/user/create', 'AdminController@userCreate')->name('userCreate');
    Route::post('manage/user/store', 'AdminController@userStore')->name('userStore');
    Route::get('manage/user/edit/{id}', 'AdminController@userEdit')->name('userEdit');
    Route::post('manage/user/update/{id}', 'AdminController@userUpdate')->name('userUpdate');
});

This is my controller:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Role;
use File;

class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware(['role:developer|admin']);
    }

    public function dashboard()
    {
        return view('admin.dashboard');
    }

    public function userIndex()
    {
        $users = User::orderBy('id', 'desc')->paginate(10);
        return view('admin.manage.user.index', compact('users'));
    }

    public function userEdit($id)
    {
        $users   = User::find($id);
        $roles  = Role::all();
        return view('admin.manage.user.edit', compact('users', 'roles'));
    }

    public function userUpdate(Request $request, $id)
    {
        // Menyiapkan data gambar yang diupload ke variabel $file
        $file_name = $request->hidden_image;
        $file = $request->file('file');
        if($file !='')
        {
            $this->validate($request,[
                'name'      =>  'required|alpha|max:255',
                'email'     =>  'required|email|unique:users',
                'password'  =>  'required',
                'file'      =>  'required|file|image|mimes:jpeg,jpg,png|max:1048'
            ]);

            // Menyiapkan data gambar yang diupload ke variabel $file
            $file_name  = time()."_".$file->getClientOriginalName();

            // Isi dengan nama folder tempat kemana file diupload
            $upload_directory = 'p_users';
            $file->move($upload_directory, $file_name);

            // Hapus file
            $gambar = User::where('id',$id)->first();
            File::delete(public_path('p_user/'.$gambar->file));
        }
        else
        {
            $this->validate($request,[
                'name'      =>  'required|alpha|max:255',
                'email'     =>  'required|email|unique:users',
                'password'  =>  'required'
            ]);
        }

        $users = User::find($id);
        $users->name     =   $request->name;
        $users->email    =   $request->email;
        $users->password =   bcrypt($request->password);
        $users->file     =   $file_name;

        $users->save();
        $users->syncRoles(explode(',', $request->roles));
        return redirect()->route('userIndex');
    }
}

This is my edit form:

<!-- Form start -->
<form action="{{route('userUpdate', $users->id)}}" method="post" enctype="multipart/form-data">
	{{csrf_field()}}
	<div class="box-body">
		<div class="row">
			<div class="col-md-3">
				<div class="form-group">
					<label>Fullname</label>
					<input type="text" value="{{$users->name}}" name="name" class="form-control">
				</div>
			</div>
			<div class="col-md-3">
				<div class="form-group">
					<label>Email address</label>
					<input type="email" value="{{$users->email}}" name="email" class="form-control">
				</div>
			</div>
			<div class="col-md-3">
				<div class="form-group">
					<label>Password</label>
					<input type="password" value="{{$users->password}}" name="password" class="form-control">
				</div>
			</div>
			<div class="col-md-3">
				<div class="form-group">
					<label>Roles</label>
					<select class="form-control" name="roles">
						<option disabled selected>Choose</option>
						@foreach ($roles as $role)
							<option value="{{$role->id}}" {{$role->id == $role->id ? 'selected' : ''}}>{{$role->display_name}}</option>
						@endforeach
					</select>
				</div>
			</div>
			<div class="col-md-3">
				<div class="form-group">
					<label>Profile Picture</label>
					<div>
						<img src="{{ url('p_users/'.$users->file) }}" width="100">
					</div>
					<input type="file" name="file" class="form-control-file">
					<input type="hidden" name="hidden_image" value="{{$users->file}}">
				</div>
			</div>
		</div>
	</div>
	<div class="box-footer">
		<button type="submit" class="btn btn-primary">Save change</button>
	</div>
</form>
0 likes
17 replies
Snapey's avatar

you see no errors?

Your code looks fine (apart from using plural users when you mean user)

Does the url change to the expected id when you edit?

rdiyto's avatar

@Snapey When I submit it, it just reloads and doesn't change anything, and stays on the edit page.

Sinnbeck's avatar

@itgoldmart Add this to the page, and try again

 
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
 
1 like
rdiyto's avatar

@Sinnbeck Thank you, this is an error because validate "required". I put "required" in all of the input forms. Do you have some advice for my code?

Sinnbeck's avatar

@itgoldmart Sorry I didnt understand that. its required so its required? What is the exact error ?

rdiyto's avatar

@Sinnbeck When I just change the name the error display that you must fill in the email too because there is "required" in the email and others.

Snapey's avatar

@itgoldmart The email should be filled in from the existing data, therefore it will be present and required on the form should work fine.

You have this;

<div class="form-group">
    <label>Email address</label>
    <input type="email" value="{{$users->email}}" name="email" class="form-control">
</div>

So the input field should be showing the email

add validation messages like this;

<div class="form-group">
    <label>Email address</label>
    <input type="email" value="{{$users->email}}" name="email" class="form-control">
    @error('email')<div class="text-danger">{{$message}}</div>@enderror
</div>
Mareco's avatar

@itgoldmart If your users don't have to fill all the fields in the form, you can replace 'required' with 'sometimes' or 'nullable' depending on what you need.

$this->validate($request,[
    'name'      =>  'sometimes|alpha|max:255',
    'email'     =>  'sometimes|email|unique:users',
    'password'  =>  'sometimes',
    'file'      =>  'sometimes|file|image|mimes:jpeg,jpg,png|max:1048'
]);

OR

$this->validate($request,[
    'name'      =>  'nullable|alpha|max:255',
    'email'     =>  'nullable|email|unique:users',
    'password'  =>  'nullable',
    'file'      =>  'nullable|file|image|mimes:jpeg,jpg,png|max:1048'
]);

I dont recommended do something like code above for inputs strongly typical for user like email, name etc, but maybe it is what you are looking for.

rdiyto's avatar

@Snapey Yes, there should be no problem. Because I already displayed the values from the database, but when I try to replace all of them it works.

Snapey's avatar

@itgoldmart LISTEN to the responses you are being given

If you change the email address to something that does not yet exist in the database, then it will work

rdiyto's avatar

@Snapey So what do I have to do to resolve this? I try to add an error message from you above, it display an error message like this "The email has already been taken."

AungHtetPaing__'s avatar

@itgoldmart

it display an error message like this "The email has already been taken."

enter new email. You can't fill same email because of unique validation rule. You should learn what is validation first.

1 like
Snapey's avatar

@itgoldmart

change your route to use route model binding before you use the example from the docs

Route::get('manage/user/edit/{user}', 'AdminController@userEdit')->name('userEdit');
Route::post('manage/user/update/{user}', 'AdminController@userUpdate')->name('userUpdate');

and in the controller

public function userUpdate(User $user)
{
    //$users   = User::find($id);
    $roles  = Role::all();
    return view('admin.manage.user.edit', compact('user', 'roles'));
 }

now your controller will be given the resolved model of the user to edit so there is no reason to load it

change $users in your blade view to `$user'

same change on the update

    public function userUpdate(Request $request, User $user)
    {
        $file = $request->file('file');
        if($file !='')
        {
            $this->validate($request,[
                'file'      =>  'required|file|image|mimes:jpeg,jpg,png|max:1048'
            ]);

            // Menyiapkan data gambar yang diupload ke variabel $file
            $file_name  = time()."_".$file->getClientOriginalName();

            // Isi dengan nama folder tempat kemana file diupload
            $upload_directory = 'p_users';
            $file->move($upload_directory, $file_name);

            // Hapus file
            File::delete(public_path('p_user/'.$user->file));

            $user->file     =   $file_name;
        }


        $this->validate($request,[
            'name'      =>  'required|alpha|max:255',
            'email'     =>   ['required', Rule::unique('users')->ignore($user->id)],
            'password'  =>  'required'
        ]);
   
        $user->name     =   $request->name;
        $user->email    =   $request->email;
        $user->password =   bcrypt($request->password);
        
        $user->save();
        $user->syncRoles(explode(',', $request->roles));
        return redirect()->route('userIndex');
    }

make sure you import the Rule class

use Illuminate\Validation\Rule;
Snapey's avatar

and stays on the edit page.

vital infort you left out of your question

so you have validation error because you don't add an ignore rule on your email validation, so the user conflicts with themselves

Please or to participate in this conversation.