使用 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 抽象。
问题:
- 有谁知道
save()
、create()
是否实际上先插入关系字段为空的行,然后再更新它 - 或者我只是做错了什么?
- 使用 Eloquent ORM 抽象的正确方法是什么?
- 我一直觉得,自从我在 Comment 上定义了一个关系
post()
,如果我使用 ORM,现在显式处理 post_id
列是不好的做法,因为它违背了重点的关系抽象。这个理念是否合理,我的想法是否正确?
注意:我知道 this question 存在,但我认为我的不是重复的,因为在那个问题中,他们的 belongsTo 关系是可选的,所以他们接受了“只需删除数据库约束/使列可为空”。我的字段不是可选字段,因此使其可为空没有意义。是的,改变数据库约束会“解决”这个问题,但我更愿意保留完整性约束,因为 post_id=null 的评论会是一个小故障,所以在数据库级别 imo 上实现它是理想的。
确保 $post
是一个“现有”模型实例。如果这是一个新实例,请务必保存它,这样它将从数据库中获得一个 'id',否则 'id' 将是 null
,它会尝试分配给相关记录的外部记录关键字段。
此问题属于 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 抽象。
问题:
- 有谁知道
save()
、create()
是否实际上先插入关系字段为空的行,然后再更新它 - 或者我只是做错了什么? - 使用 Eloquent ORM 抽象的正确方法是什么?
- 我一直觉得,自从我在 Comment 上定义了一个关系
post()
,如果我使用 ORM,现在显式处理post_id
列是不好的做法,因为它违背了重点的关系抽象。这个理念是否合理,我的想法是否正确?
注意:我知道 this question 存在,但我认为我的不是重复的,因为在那个问题中,他们的 belongsTo 关系是可选的,所以他们接受了“只需删除数据库约束/使列可为空”。我的字段不是可选字段,因此使其可为空没有意义。是的,改变数据库约束会“解决”这个问题,但我更愿意保留完整性约束,因为 post_id=null 的评论会是一个小故障,所以在数据库级别 imo 上实现它是理想的。
确保 $post
是一个“现有”模型实例。如果这是一个新实例,请务必保存它,这样它将从数据库中获得一个 'id',否则 'id' 将是 null
,它会尝试分配给相关记录的外部记录关键字段。