【发布时间】:2021-06-30 07:09:15
【问题描述】:
我使用了 laravel documentation 中描述的一对多多态关系,以便能够将不同的父模型关联到一个子模型。我假设,我可以将不同的父模型分配给同一个子模型。但这不起作用。一旦我与另一个父模型与同一个子模型创建新关系,旧关系就会被替换。
例子:
A、B 和 C 是父模型,每个模型都有一个数据记录 (id=1)。
X 是具有一条数据记录的子模型 (id=1)
我不能用常用的方法做这样的事情:
A(id=1) X(id=1)
B(id=1) X(id=1)
C(id=1) X(id=1)
由于最后一次创建关系总是会覆盖前一个。在此示例中,将保留一个关系 (C(id=1) X(id=1))
我可以通过多对多多态实现来做到这一点——但这实际上不是我想要的,因为我不希望父模型能够与子模型有多个关系。 (尽管我可以通过在相应字段的 *able 表中创建复合键来排除这种情况)
这是实际代码,应该将一个图像分配给多个父模型(但只保留循环内的最后一个保存 - 如果我在循环结束时添加一个中断,则保存第一个):
public function store(StoreImageRequest $request)
{
$validated = $request->validated();
$image = $validated['image'];
$name = isset($validated['clientName']) ? $image->getClientOriginalName() : $validated['name'];
$fileFormat = FileFormat::where('mimetype','=',$image->getClientMimeType())->first();
$path = $image->store('images');
$imageModel = Image::make(['name' => $name, 'path' => $path])->fileFormat()->associate($fileFormat);
$imageModel->save();
$relatedModels = Image::getRelatedModels();
foreach($relatedModels as $fqcn => $cn) {
if(isset($validated['model'.$cn])) {
$id = $validated['model'.$cn];
$models[$fqcn] = call_user_func([$fqcn, 'find'], [$id])->first();
$models[$fqcn]->images()->save($imageModel);
}
}
}
【问题讨论】:
-
也许添加 getRelatedModels 的实现以真正完全理解您的代码是有意义的。乍一看,我会说
$models[$fqcn]->images()->save($imageModel);行是问题所在。我猜想 imageModel 在保存后会更新,并且多次调用它也会更新引用。也许将您的关系定义也添加到代码中。您可以快速尝试$models[$fqcn]->images()->sync([$imageModel->id]); -
@Frnak 我不认为这应该是一个问题 - 因为我这样做并且想要保存不同的参考。因此 imageModel 应该正确处理。但我会试一试。您确定该关系类型的预期行为 - 我认为它是否应该能够将特定孩子与多个父母联系起来?
标签: laravel one-to-many relation polymorphic-relationship