首页 > 解决方案 > (Laravel)如何删除多个模型,包括可选关系?

问题描述

概括

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

情况

尝试

1)迭代和删除:

Post::findMany($ids)->each(function($item) use ($related_models) {
    foreach ($related_models as $relation) {
        $item->{$relation}()->delete();
    }
    $item->delete();
});

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

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

// 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);

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

问题

什么是最有效的方法,同时:

?

笔记

标签: phplaravellaravel-5.7

解决方案


您应该先删除关系模型

在您的 Post 模型中添加此方法:

public function delete()
{
    $this->images()->delete();
    $this->comments()->delete();

    return parent::delete(); 
}

从您的控制器逻辑调用这将首先删除关系模型,然后自行删除

Post::findMany($ids)->each(function ($item) {
        $item->delete();
    });

推荐阅读