代码之家  ›  专栏  ›  技术社区  ›  b00sted 'snail'

正确删除相关模型

  •  0
  • b00sted 'snail'  · 技术社区  · 6 年前

    我的商店功能是

    public function store(Request $request, Post $post)
    {
        $comment = new Comment();
        $comment->fill($request->all());
        $post->comments()->save($comment);
    }
    

    public function destroy(Post $post, Comment $comment)
    {
    
    }
    

    我从文档中得到的存储函数( Inserting & Updating Related Models

    那么,通过Post模型删除评论的最佳实践是什么呢?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jonathon    6 年前

    因为你们的关系 hasMany belongsTo ,您实际上不需要删除评论 通过 一个职位。注释作为自己的记录存在于自己的表中,并通过 post_id 如果你遵守了拉威尔的命名惯例。

    在这种情况下,要删除注释,只需使用 delete

    public function destroy(Post $post, Comment $comment)
    {
        $comment->delete();
    }
    

    SoftDeletes 身体上的特质 Comment deleted_at 到当前时间戳。否则,它将从数据库中删除该记录。如果您正在使用 软删除 已在删除\u forceDelete (见下) 永久删除模型

    public function destroy(Post $post, Comment $comment)
    {
        $comment->forceDelete();
    }
    

    如果您想简单地销毁评论和帖子之间的引用,可以使用 dissociate 方法。这将有效地设置 邮政编码 null 不会从表中删除注释。

    public function destroy(Post $post, Comment $comment)
    {
        $comment->post()->dissociate();
        $comment->save();
    }
    

    如果确实要使用关系确保只能删除属于给定帖子的评论,可以执行以下操作:

    $post->comments()->whereKey($comment->id)->delete();
    

    where 以确保注释 邮政编码 等于职位的ID。

    belongsToMany 两个方向)您需要删除透视表中的记录。你会用 detach 或者你可以用 sync 只提供应该留下的。

        2
  •  -1
  •   FULL STACK DEV    6 年前

    您可以尝试使用Laravel Observer,这里是一个示例

    对于创建观察者,您可以

    php artisan make:observer PostObserver
    

    它将创造一个很好的样板。

    class PostObserver
    {
    
        public function deleting(Post $post){
    
            $comments =  $post->comments;
            $comments->delete();
        }
    
    }
    

    Post::observe(PostObserver);
    

    推荐文章