Laravel Eloquent如何保存HasMany并关联BelongsTo且无需外键可空
解决方案
你可以在首次写入数据库前就完成所有关联的绑定,仅执行一次保存操作,既不需要将外键加入$fillable,也不用修改迁移将user_id设为可空:
// 仅将业务字段传入构造方法,无需传入外键 $note = new Note([ 'title' => 'Foobar' ]); // 提前绑定两个关联关系 $note->page()->associate($this->page); $note->user()->associate(auth()->user()); // 一次性写入数据库,此时两个外键均已赋值,满足非空约束 $note->save();
原代码问题说明
你之前的写法中调用$this->page->notes()->create()时就已经触发了INSERT操作写入数据库,此时user_id还未赋值,自然会违反非空约束报错。
优化方案(适用于Note所属用户与Page所属用户一致的业务场景)
如果你的业务逻辑中,Note的归属用户必然等于其关联Page的归属用户,可以直接在Note模型中添加创建事件钩子自动填充user_id:
// 在Note模型的booted方法中注册创建钩子 protected static function booted() { static::creating(function (Note $note) { // 关联Page存在且未手动指定user_id时,自动从Page取用户id填充 if ($note->page && empty($note->user_id)) { $note->user_id = $note->page->user_id; } }); }
配置完成后直接执行以下代码即可完成创建,不需要手动绑定用户关联:
$note = $this->page->notes()->create([ 'title' => 'Foobar' ]);
内容的提问来源于stack exchange,提问作者DarkLeafyGreen
相关产品推荐
相关产品推荐

