You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.');
}

遇到的错误

  1. 当合并当前用户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)
  1. 当合并用户对象(auth()->user())到请求时,验证器提示:The selected user id is invalid.

请问我忽略了什么?


解决方案

问题核心在于请求验证逻辑的顺序和validated()方法的作用范围:

  • 手动合并的user_id未被纳入验证结果
    你使用的PdlocationStoreRequest是自定义请求类,$request->validated()只会返回该类规则中定义的字段。如果user_id不在PdlocationStoreRequest的rules()方法里,即使你用$request->merge()添加,也不会被包含到创建模型的数据集里,这就是SQL报错的原因。

    两种解决方式:

    1. 在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',
          ];
      }
      
    2. 创建模型时手动合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:07:18