Laravel查询异常:编辑表单方法出现奇怪行为求助
修复你的Laravel User编辑方法问题
嘿,我看了你写的这个编辑用户的方法,发现里面有个容易踩的小坑,咱们来把它修正一下~
首先看你原来的代码:
/**
- 显示指定资源的编辑表单。
- @param \App\User $users
- @return \Illuminate\Http\Response
*/
public function edit(User $user) {
//获取指定用户名的用户
$user = User::findOrFail($user)->get();
return view('users.edit', compact('user')); //向视图传递用户和角色数据
}
这里的问题在于:你已经通过路由模型绑定自动拿到了$user实例,却又重复去执行了一次查询,而且get()还会把单个模型变成集合,这会导致视图里调用用户属性的时候直接报错。
修正后的代码
/** * 显示指定资源的编辑表单。 * * @param \App\User $user * @return \Illuminate\Http\Response */ public function edit(User $user) { // 路由模型绑定已经自动帮你获取了对应的User实例,不需要额外查询 return view('users.edit', compact('user')); }
为什么要这么改?
- 当你的路由定义成类似
Route::get('/users/{user}/edit', [UserController::class, 'edit'])的时候,Laravel会自动根据{user}参数(默认是模型ID)去数据库查找对应的User模型实例,直接注入到方法的$user参数里,完全不需要你手动调用findOrFail。 - 你原来的
User::findOrFail($user)是错误的:findOrFail()需要传入ID值(比如数字),但你传的是已经是User实例的$user;而且后面的get()会返回一个用户集合,不是单个用户对象,这会让视图里的{{ $user->name }}这类代码直接抛出“试图获取非对象属性”的错误。
对应的路由配置(补充)
如果你的路由还没正确配置,推荐用Laravel的资源路由(自动生成全套CRUD路由),在routes/web.php里添加:
use App\Http\Controllers\UserController; Route::resource('users', UserController::class);
或者单独定义edit路由:
Route::get('/users/{user}/edit', [UserController::class, 'edit'])->name('users.edit');
这样修改后,你的edit方法就能正确把单个用户实例传递给users.edit视图,视图里也能正常访问用户的各种属性啦~
内容的提问来源于stack exchange,提问作者Jesse Luke Orange
相关产品推荐
相关产品推荐

