我正试图让我的模型控制器删除多个模型(由ID数组选择),包括与它们相关的 selected 模型(由关系名称数组选择) )。
具有关系的模型Post
:
Comment
模型的(一对多)$post->comments()
模型的(一对多)Image
下具有$post->images()
模型的(一对多)User
中,有一种$post->user()
方法可以处理删除操作,并且在这里:
PostController
模型的数组destroy_multiple
要删除(例如$ids
)Post
(例如[1,2,4]
,但在每次调用中可能是不同的选择)1)迭代并删除:
$related_models
问题: :必须首先检索所有模型,并且对于每个模型,必须删除所有选定的相关模型。这是很多开销。
2)删除相关模型和模型:
['user','comments']
问题: :该方法仅适用于一对多关系,并且仅提供根据Laravel标准命名的数据库列。
最有效的方法是什么,而:
Post::findMany($ids)->each(function($item) use ($related_models) {
foreach ($related_models as $relation) {
$item->{$relation}()->delete();
}
$item->delete();
});
和// For every selected relationship, delete related models
foreach ($related_models as $relation) {
$class = 'App\\' . studly_case(str_singular($relation));
$class::whereIn('post_id', $ids)->delete();
}
// Delete the models
Post::destroy($ids);
的选择性?
$ids
)不是很好的做法,但出于问题的考虑,确实存在。 ;)$related_models
约束(在迁移过程中)会使其失去可选项性。现在,相关模型已总是被删除,在除User
方法之外的其他情况下也被删除。答案 0 :(得分:0)
您可以这样更新迁移:
Schema::table('comments', function (Blueprint $table) {
...
$table->unsignedInteger('posts_id');
$table->foreign('posts_id')
->references('id')
->on('posts')
->onDelete('cascade');
});
以上迁移将自动删除与您要删除的帖子相关的所有评论。
答案 1 :(得分:0)
您应该先删除关系模型
在您的Post模型中添加此方法:
public function delete()
{
$this->images()->delete();
$this->comments()->delete();
return parent::delete();
}
从控制器逻辑中调用 这将首先删除关系模型,然后再删除自身
Post::findMany($ids)->each(function ($item) {
$item->delete();
});