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
相关产品推荐
相关产品推荐

