Я не могу найти хитрость, чтобы получить следующее.
Скажем, у меня есть два Entity
: Main
и Minor
, Main
один-ко-многим Minor
,mainId
- поле внешнего ключа.
Я хотел бы иметь (Незначительную) форму для создания объекта Minor
, чтобы пользователи могли выбирать его объект Main
из списка уже доступных Main
объектов, и (Основной)Форма для создания Main
объекта и, возможно, множества различных Minor
(под) объектов одновременно.
Проблема в том, что в последнем случае я не могу сохранить внешний ключ.
Для младшей формы я определяю:
$builder ->add('minorTitle')
->add('Main', EntityType::class, array(
'class' => Main::class,
'choice_label' => 'mainTtile',
'label' => 'main'))
have 'data_class' => Minor::class
, и работает нормально.
Для основной формы я попытался:
$builder
->add('mainTitle')
->add('Minors', CollectionType::class, array(
'entry_type' => MinorType::class,
'allow_add' => true,
'label' => 'Minor'
))
'data_class' => Main::class`
Таким образом, малая форма действительно встроена как подчиненная форма в основную форму.Чтобы добавить больше подчиненных форм, у меня есть несколько JS, как предложено в CollectionType .Чтобы не отображать поле Main
в второстепенных подчиненных формах, я немного взломал prototype
чем-то вроде:
newWidget = newWidget.replace(newWidget.match(/\B<div class="form-group"><label class="required" for="main_Minors___name_Main">Main<\/label><select id="main_Minors___name_Main" name="main\[Minors\]\[__name__\]\[Main\]" class="form-control">.*<\/select>\B/g),"");
Пользователь может создать главный объект и множество второстепенныхтоже, но id
первого не сохраняется как внешние ключи последних.Я пытался исправить вещи в главном контроллере с помощью чего-то вроде (или вариантов):
public function new(Request $request): Response {
$em = $this->getDoctrine()->getManager();
$main = new Main();
$form = $this->createForm(MainType::class, $main);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$postData = $request->request->get('main');
$minors = array();
foreach($postData['Minors'] as $key => $obj){
$minors[$key]= new Minor();
$minors[$key]->setMain($main);
$minors[$key]->setMinorTitle($obj['minorTitle']);
$em->persist($minors[$key]);
}
$em->persist($main);
$em->flush();
}
, но либо он не работает, либо дважды сохраняет один и тот же подобъект (только один раз с правильным внешним ключом),
(Возможно, я мог бы исправить два разных класса MinorType, но я бы хотел этого избежать)
Спасибо