使用 Laravel ORM 抽象保存新的不可空关系而不违反数据库完整性约束

Save new non-nullable relationship using Laravel ORM abstraction without database integrity constraint violation

此问题属于 Laravel 7。

我有两个模型,比方说 Post 和 Comment,在典型的一对多关系中。关系及其逆关系均已定义。在为他们的数据库 table 进行迁移时,我没有将评论 table 上的 post_id 设置为可为空。我认为使其不可为空是一个合理的约束,因为所有评论在逻辑上都必须附加到 Post.

不过我好像不能用create(), save()等来关联新评论的关系。我想做类似的事情:

$post->comments()->create(["text" => "Comment text goes here"]);

我假设这会创建填充了 post_id 的评论,但是,唉,它会在数据库级别引发“违反完整性约束”(post_id 不能为空)

同样,我试过:

$comment = new Comment(["text" => "Comment text goes here"]); 
$post->comments()->save($comment); 

同样的事情 - 违反数据库完整性约束。但为什么?我希望 Laravel 在创建此 Comment 时不会只进行一个包含 post_id 的 INSERT 操作。在这两种情况下,我都不希望插入新的评论 post_id 为空。

我知道我可以在创建时手动将 post_id 设置为主键,如果真的没有其他选择,我会这样做 - 我更喜欢尽可能使用 ORM 抽象。

问题:

注意:我知道 this question 存在,但我认为我的不是重复的,因为在那个问题中,他们的 belongsTo 关系是可选的,所以他们接受了“只需删除数据库约束/使列可为空”。我的字段不是可选字段,因此使其可为空没有意义。是的,改变数据库约束会“解决”这个问题,但我更愿意保留完整性约束,因为 post_id=null 的评论会是一个小故障,所以在数据库级别 imo 上实现它是理想的。

确保 $post 是一个“现有”模型实例。如果这是一个新实例,请务必保存它,这样它将从数据库中获得一个 'id',否则 'id' 将是 null,它会尝试分配给相关记录的外部记录关键字段。