php - (Laravel)如何删除多个模型,包括可选关系?
问题描述
概括
我试图让我的模型控制器删除多个模型(由 ID 数组选择),包括它们选择的相关模型(由关系名称数组选择)。
情况
Post
有关系的模型:- (一对多)与
Comment
模型下$post->comments()
- (一对多)与
Image
模型下$post->images()
- (多对一)与
User
模型下$post->user()
- (一对多)与
PostController
那里有处理删除的方法destroy_multiple
,我有:- 带有要删除
$ids
的模型 ID 的数组(例如)Post
[1,2,4]
$related_models
包含要删除的关系名称的数组(例如['user','comments']
,但在每次调用中可能是不同的选择)
- 带有要删除
尝试
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 标准命名。
问题
什么是最有效的方法,同时:
- 使用定义的关系来确保正确的数据库命名、列等(如尝试 1 中所示)
- 保持性能(无需检索模型)(如尝试 2)
- 保持选择
$ids
和的可选性$related_models
?
笔记
- 我知道删除父模型(
User
在这种情况下)不是很好的做法,但为了这个问题而存在。;) - 对相关模型表的外键使用数据库
CASCADE
约束(在迁移中)使其失去可选性。相关模型现在总是被删除,在delete_multiple
方法之外的其他情况下也是如此。
解决方案
您应该先删除关系模型
在您的 Post 模型中添加此方法:
public function delete()
{
$this->images()->delete();
$this->comments()->delete();
return parent::delete();
}
从您的控制器逻辑调用这将首先删除关系模型,然后自行删除
Post::findMany($ids)->each(function ($item) {
$item->delete();
});
推荐阅读
- json - 从 bash 脚本发送 POST 请求
- javascript - 如何修复获取json参数并将其发送到url的java脚本函数
- delphi - 挂钩 Delphi TReader.OnFindComponentClass
- java - 无法使用 zipOutputStream 在 java 中压缩文件?
- spring-boot - WebClient 首次请求缓慢的解决方法
- java - 接口与单例中的全局变量
- php - 我如何在我的 laravel5.7 网站中添加 Metas,如标题、描述、关键字
- javascript - 如何使用向量施加不同的力?
- math - Julia - 数组的绝对值
- android - 尝试使用 SharedPreferences 更改颜色,但方法不正确