我正在创建一个产品系统并使用Laravel作为API。我有一个产品模型和一个具有多对多关系的文件模型。将文件分配给产品时,我将一组文件对象传递给Product控制器,然后检查该关系是否已存在。如果不是,我保存这种新关系。以下是执行此操作的代码:
if(!empty($requestProductVars['files']) && count($requestProductVars['files'])) {
$files = $requestProductVars['files'];
foreach($files as $file) {
$fileId = $file['id'];
$fileRecord = File::find($fileId);
if(!$product->files->contains($fileRecord)) {
$product->files()->save($fileRecord);
}
}
}
$product->save();
这一切都很好,但我现在想要实现的是有点棘手。如果产品有一个UNASSIGNED文件,我希望将此记录作为与产品的关系删除。所以我需要做的是删除数据透视表中$ requestProductVars ['files']数组中不存在的任何行。
我正在考虑创建单独的查询以获取项目的所有文件ID,并将其与对象数组进行比较,并删除请求数组中不存在的任何文件,但这似乎有点资源。有没有人知道以更好的方式实现这一功能的任何方式?
由于
答案 0 :(得分:1)
使用sync()
方法怎么样?它将添加/保留数组中的所有行,并将删除所有其他关系:
$product->files()->sync($files);
$files
应该是一系列ID,例如:[1, 2, 3, 4]
如果$files
不包含所有关系,您可以先获取所有附加文件的ID,然后使用$files
将此数组合并。