Я использовал полиморфные отношения «один ко многим», как описано в laravel документацию, чтобы можно было связать разные родительские модели с одной дочерней моделью. Я предположил, что смогу назначить разные родительские модели одной и той же дочерней модели. но это не работает. как только я создаю новое отношение с другой родительской моделью к тому же ребенку, старое отношение заменяется.
Пример:
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);
}
}
}
$models[$fqcn]->images()->save($imageModel);
. Я предполагаю, что imageModel обновляется после сохранения, и его многократный вызов также обновит ссылки. Возможно, вы также добавите в код определения своих отношений. Вы можете быстро попробовать$models[$fqcn]->images()->sync([$imageModel->id]);
- person Frnak   schedule 02.07.2021