Laravel 5.6多认证下资源Show方法Eloquent查询返回Null求助
兄弟,我之前也踩过类似的Laravel多认证坑,给你几个针对性的排查方向,应该能帮你找到问题:
检查路由模型绑定的参数匹配
如果你是给特定Guard的模型(比如Admin而非默认User)定义资源路由,一定要确保控制器方法的参数和路由参数、模型对应上。举个例子:// 假设你定义的资源路由是针对管理员的 Route::resource('admins', 'AdminController'); // 那控制器的show方法就不能写public function show(User $user),得改成public function show(Admin $admin)另外,如果模型自定义了路由键(比如用
username代替id),要在模型里设置getRouteKeyName(),同时确保URL里的参数是对应的值。确认模型主键与数据存在性
先检查你的模型是不是用了非默认主键(比如UUID),如果是,得在模型里配置:protected $primaryKey = 'uuid'; public $incrementing = false; // 非自增主键必须加这个同时直接去数据库里确认,你访问的URL参数(比如
/users/1里的1)对应的记录确实存在,别是查了个不存在的ID。排查软删除的影响
如果你的模型用了SoftDeletestrait,而目标记录已经被软删除,默认查询会自动过滤掉这些数据,自然返回null。可以临时在show方法里加个测试:public function show(User $user) { $testUser = User::withTrashed()->find($user->id); dd($testUser); // 看看能不能拿到软删除的记录 }检查多认证的全局查询范围
多认证体系下,很多人会给模型加全局查询范围,只返回当前Guard对应的用户组数据。比如管理员Guard只能查管理员用户,如果你用管理员身份访问普通用户的ID,就会返回null。去模型里看看有没有类似代码:protected static function boot() { parent::boot(); static::addGlobalScope('guard', function ($query) { $query->where('guard_name', auth()->guard()->getName()); }); }如果有的话,要么确认访问的记录符合这个范围,要么在show方法里临时移除范围:
public function show(User $user) { $user = User::withoutGlobalScope('guard')->find($user->id); }手动查询排除路由绑定问题
先把路由模型绑定去掉,手动用ID查询试试:public function show($id) { $user = User::find($id); dd($user); // 如果能拿到数据,说明是路由模型绑定的问题;如果还是null,那就是数据或查询逻辑的问题 }核对路由定义完整性
你提供的路由代码没写完,记得运行php artisan route:list查看生成的路由,确认show方法的URL、参数和控制器方法对应正确,比如资源路由是不是正确指定了控制器:Route::resource('users', 'UserController');
希望这些方法能帮你快速定位问题!
内容的提问来源于stack exchange,提问作者Brent Robinson

