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

Laravel新增收容所记录写入当前用户ID报1364无默认值错误

问题根因

触发报错的核心问题有3个:

  • 外键字段命名严重不规范:在animal_shelters表中直接将关联用户的外键字段命名为id,和框架默认主键命名规则冲突,语义完全混乱。
  • 非空字段未赋值触发约束:上述id字段被定义为非空外键,但插入数据的逻辑中没有给该字段传入任何值,直接触发SQLSTATE[HY000]:1364 非空字段无默认值的报错。
  • 模型配置缺失:自定义主键为shelter_id后,没有在模型中指定主键字段,会导致ORM增删改查时出现主键识别异常。
正确实现方案

1. 修正表迁移文件

将关联用户的外键字段名调整为符合Laravel命名约定的user_id,修改后的animal_shelters迁移代码如下:

public function up()
{
    Schema::create('animal_shelters', function (Blueprint $table) {
        $table->id('shelter_id');
        $table->timestamps();
        // 外键字段命名为user_id,关联users表主键id
        $table->foreignId('user_id')->constrained('users');
        $table->string('shelter_name');
        $table->string('shelter_address');
        $table->string('shelter_mobile_number');
        $table->string('shelter_type');
    });
}

注意:本地开发环境可直接执行php artisan migrate:fresh重置表结构应用修改;生产环境请新建修改字段的迁移文件执行,禁止直接重置线上数据库。

2. 配置Animalshelter模型

在模型中指定自定义主键,配置允许赋值的字段,可选定义和用户模型的关联关系:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Animalshelter extends Model
{
    // 指定自定义主键
    protected $primaryKey = 'shelter_id';

    // 配置允许赋值的字段
    protected $fillable = [
        'user_id',
        'shelter_name',
        'shelter_address',
        'shelter_mobile_number',
        'shelter_type',
    ];

    // 定义关联关系:一条收容所记录归属于一个提交用户
    public function submitUser(): BelongsTo
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }
}

3. 修正插入逻辑

新增收容所记录时,给user_id字段传入当前登录用户的ID即可:

public function store(Request $request)
{
    // 建议提前加表单验证,此处省略验证逻辑
    $Animal_shelter = new Animalshelter();
    $Animal_shelter->shelter_name = $request->input('shelter_name');
    $Animal_shelter->shelter_address = $request->input('shelter_address');
    $Animal_shelter->shelter_mobile_number = $request->input('shelter_mobile_number');
    $Animal_shelter->shelter_type = $request->input('shelter_type');
    // 传入当前登录用户ID,Laravel默认认证体系下可通过auth()->id()直接获取
    $Animal_shelter->user_id = auth()->id();
    $Animal_shelter->save();

    return redirect()->back()->with('status', 'shelter added successfully');
}
可选优化

如果不想每次插入都手动写user_id赋值逻辑,可以在模型的booted方法中注册creating事件,自动填充当前操作人ID:

protected static function booted()
{
    static::creating(function ($model) {
        $model->user_id = auth()->id();
    });
}

注意访问该新增接口的路由必须挂载auth中间件,保证只有登录用户可以提交,避免user_id写入空值。

内容的提问来源于stack exchange,提问作者vishwajeetpanwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:54:08