Laravel Eloquent获取数组中不存在的所有行

时间:2016-11-24 14:13:55

标签: laravel eloquent

我正在创建一个产品系统并使用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,并将其与对象数组进行比较,并删除请求数组中不存在的任何文件,但这似乎有点资源。有没有人知道以更好的方式实现这一功能的任何方式?

由于

1 个答案:

答案 0 :(得分:1)

使用sync()方法怎么样?它将添加/保留数组中的所有行,并将删除所有其他关系:

$product->files()->sync($files);

$files应该是一系列ID,例如:[1, 2, 3, 4]

如果$files不包含所有关系,您可以先获取所有附加文件的ID,然后使用$files将此数组合并。