Laravel 11中validated()关联表插入user_id失败求助
问题描述
我希望将当前用户的user_id插入pdlocations表的user_id字段(该字段与users表关联)。
迁移/数据库架构
Schema::create('pdlocations', function (Blueprint $table) { $table->id(); $table->timestamps(); $table->decimal('lon', 10, 7); $table->decimal('lat', 10, 7); $table->string('map'); $table->unsignedBigInteger('user_id'); $table->foreign('user_id') ->references('id') ->on('users'); });
控制器(PdlocationController.php)代码
public function store(PdlocationStoreRequest $request): RedirectResponse { $request->merge([ 'user_id' => auth()->user()->id, // 'user_id' => auth()->user(), ]); $this->validate($request, [ 'user_id' => 'required|exists:users,id', ]); Pdlocation::create($request->validated()); return redirect()->route('admin.pdlocation.index') ->with('success', 'Pdlocation created successfully.'); }
遇到的错误
- 当合并当前用户ID(
auth()->user()->id)到请求时,出现SQL错误:
SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value insert into `pdlocations` (`map`, `lon`, `lat`, `updated_at`, `created_at`) values (test, 66, 55, 2024-06-21 18:42:57, 2024-06-21 18:42:57)
- 当合并用户对象(
auth()->user())到请求时,验证器提示:The selected user id is invalid.
请问我忽略了什么?
解决方案
问题核心在于请求验证逻辑的顺序和validated()方法的作用范围:
手动合并的
user_id未被纳入验证结果
你使用的PdlocationStoreRequest是自定义请求类,$request->validated()只会返回该类规则中定义的字段。如果user_id不在PdlocationStoreRequest的rules()方法里,即使你用$request->merge()添加,也不会被包含到创建模型的数据集里,这就是SQL报错的原因。两种解决方式:
- 在
PdlocationStoreRequest的规则中添加user_id:public function rules() { return [ 'lon' => 'required|decimal:10,7', 'lat' => 'required|decimal:10,7', 'map' => 'required|string', 'user_id' => 'required|exists:users,id', ]; } - 创建模型时手动合并
user_id到验证后的数据(更安全,避免前端篡改):$validated = $request->validated(); $validated['user_id'] = auth()->id(); // 简写方式,等价于auth()->user()->id Pdlocation::create($validated);
- 在
合并用户对象导致验证失败
auth()->user()返回的是完整的用户模型对象,而user_id字段需要的是整数类型的ID值,直接传对象会让exists:users,id规则无法匹配,因此必须传递ID数值。冗余的手动验证
PdlocationStoreRequest会自动处理验证逻辑,不需要再调用$this->validate($request, [...]),可以删除这行重复验证代码。
优化后的控制器代码示例:
public function store(PdlocationStoreRequest $request): RedirectResponse { $validated = $request->validated(); $validated['user_id'] = auth()->id(); Pdlocation::create($validated); return redirect()->route('admin.pdlocation.index') ->with('success', 'Pdlocation created successfully.'); }
内容的提问来源于stack exchange,提问作者user25668973
相关产品推荐
相关产品推荐

