Laravel Eloquent 更新一对多关系

3
在 Laravel 中,我已经正确地设置了一对多关系,并且可以使用 saveMany 函数保存关系。
$post->comment()->saveMany($array);

问题是:
如何让Laravel自动删除未使用的注释,并仅将最新的注释存储到数据库中?
例如,第一次,
ID 1 Post has ID 1, ID2, ID 3 comment.

然而,当我稍后更新关系时,
ID 1 Post only has ID 2, ID 3 comment

如何让Laravel自动删除ID为1的评论,并且只保留表格中的ID为2和3?谢谢。

2个回答

0

对于多对多关系,没有像detach()方法那样的方法,但是您可以执行以下操作

// detach old first
$post->comment()->get()->each(function($comment) use ($array){        
    if (!in_array($comment, $array)) 
    // if (!$array->contains($comment)) in case of collection
    {
        $comment->post_id = null;
        $comment->save();
    }        
});

// attach new ones
$post->comment()->saveMany($array); 

希望这能有所帮助。

0

使用saveMany()函数,您可以附加新实体并自动将外键设置为父实体(在存储它们时设置$comment->post_id = $post->id;)。这仅用于附加它们,因为您声明评论始终与帖子相关。一对多定义了您的Post有许多评论,而评论属于帖子,由评论中的post_id定义。

除非您想要与帖子无关的评论,否则没有意义,我会说您不应该取消评论中的post_id,而是如果要摆脱它们,只需删除评论即可。 但是,如果您确实想这样做,请尝试$comment->dissociate(),它会取消父键的设置。这就像在多对多上使用detach()


问题是当我再次使用save many时,Laravel不会删除无关的评论。这些无关的评论仍然与父键一起保存在数据库中,我该如何摆脱它们? - user2617403
saveMany() 只会添加新的项目,而不会删除它们。如果要取消父级,请使用 @zub0r 的示例,或者像我上面说的那样使用 $comment->dissociate()。如果您想完全删除它们而不是取消关系并保存它们,请在 foreach 循环中调用 $comment->delete(); - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接