(Laravel)如何删除包括可选关系在内的多个模型?

时间:2019-02-18 03:44:43

标签: php laravel laravel-5.7

摘要

我正试图让我的模型控制器删除多个模型(由ID数组选择),包括与它们相关的 selected 模型(由关系名称数组选择) )。

情况

  • 具有关系的模型Post

    • ({@ 1}}下Comment模型的(一对多)
    • ({@ 1}}下$post->comments()模型的(一对多)
    • Image下具有$post->images()模型的(一对多)
  • User中,有一种$post->user()方法可以处理删除操作,并且在这里:
    • ID为PostController模型的数组destroy_multiple要删除(例如$ids
    • 具有关系名称也要删除的数组Post(例如[1,2,4],但在每次调用中可能是不同的选择)

尝试

1)迭代并删除:

$related_models

问题: :必须首先检索所有模型,并且对于每个模型,必须删除所有选定的相关模型。这是很多开销。

2)删除相关模型和模型:

['user','comments']

问题: :该方法仅适用于一对多关系,并且仅提供根据Laravel标准命名的数据库列。

问题

最有效的方法是什么,而:

  • 使用定义的关系来确保正确的数据库命名,列等(如尝试1中所述)
  • 保持性能(无需检索模型)(如尝试2)
  • 保持选择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方法之外的其他情况下也被删除。

2 个答案:

答案 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();
    });