Laravel中Auth::user()->pluck()异常行为的原因咨询
关于Laravel中
Auth::user()->pluck('id')返回所有用户ID的问题解析 一、为什么Auth::user()->pluck('id')会返回所有用户ID?
Auth::user()返回的是当前登录用户的单个Eloquent模型实例,但你调用的pluck()是Eloquent查询构建器的方法。当在模型实例上调用查询构建器方法时,Laravel会自动将其转换为针对整个users表的查询构建器(等同于User::query()),此时执行pluck('id')就会查询并返回所有用户的ID集合,而非当前单个用户的ID。
如果你要获取当前用户ID的单元素集合,正确写法是:
// 方式1:先取单个ID再转为集合 $items = collect([Auth::user()->id]); // 方式2:直接用Auth facade获取ID再转集合 $items = collect([Auth::id()]);
二、两段关联查询代码的差异原因
第一段代码的问题:
$physicalExercises = Auth::user() ->with('physicalExercises') ->first() ->physicalExercises ->pluck('name', 'id');
Auth::user()已经拿到了当前用户的模型实例,但调用with('physicalExercises')时,模型实例会被转换为无约束的查询构建器(即针对全表的查询),后续的first()会返回数据库中第一个用户的模型,而非当前登录用户,最终拿到的是第一个用户的physicalExercises关联数据。
第二段代码的正确性:
$physicalExercises = User::where('id', Auth::id()) ->with('physicalExercises') ->first() ->physicalExercises ->pluck('name', 'id');
这段代码先通过where('id', Auth::id())明确限定查询范围为当前登录用户,再预加载关联physicalExercises,first()返回的是当前用户的模型,最终获取的是当前用户的关联数据,符合预期。
另外,还有更简洁的写法,直接利用Auth::user()的关联加载:
// 直接加载当前用户的关联并获取集合 $physicalExercises = Auth::user()->physicalExercises()->pluck('name', 'id'); // 或者预加载后获取(适合后续还要用模型其他属性的场景) $user = Auth::user()->load('physicalExercises'); $physicalExercises = $user->physicalExercises->pluck('name', 'id');
内容的提问来源于stack exchange,提问作者Dimas
相关产品推荐
相关产品推荐

