我的商店功能是
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模型删除评论的最佳做法是什么?
答案 0 :(得分:1)
由于您的关系是hasMany
和belongsTo
,因此您实际上不需要通过帖子 删除评论。该注释作为其自己的记录存在于其自己的表中,并且如果您遵守Laravel的命名约定,则该注释通过post_id
与帖子相关联。
在这种情况下,只需删除delete
方法即可删除评论:
public function destroy(Post $post, Comment $comment)
{
$comment->delete();
}
如果您在SoftDeletes
模型上使用Comment
特征,则只需将deleted_at
设置为当前时间戳。如果没有,它将从数据库中删除记录。如果您使用的是SoftDeletes
,并且想从表中删除记录(而不仅仅是设置deleted_at
),则可以使用forceDelete
(请参见永久删除模型下的内容) ):
public function destroy(Post $post, Comment $comment)
{
$comment->forceDelete();
}
如果您只想破坏评论和帖子之间的引用,则可以在评论对象上使用dissociate
方法。这实际上将只是将post_id
字段设置为null
,并且不会从表中删除注释。
public function destroy(Post $post, Comment $comment)
{
$comment->post()->dissociate();
$comment->save();
}
如果您真的想使用这种关系来确保只能删除属于给定帖子的评论,则可以执行以下操作:
$post->comments()->whereKey($comment->id)->delete();
这将为查询添加一个额外的where
,以确保评论中的post_id
与帖子的ID相等。
作为参考,如果您具有多对多关系(双向belongsToMany
),则需要删除数据透视表中的记录。为此,您可以使用detach
或使用sync
仅提供应保留的内容。
答案 1 :(得分:-1)
您可以尝试使用Laravel Observer,这是一个示例
要创建观察者,您可以
php artisan make:observer PostObserver
它将创建一个不错的样板。
class PostObserver
{
public function deleting(Post $post){
$comments = $post->comments;
$comments->delete();
}
}
在您的AppServiceProvider.php中
Post::observe(PostObserver);
它将在删除帖子之前删除相关模型。