Привет, у меня есть проблема с моей многократной встроенной формой (один для многих). В одной игре есть много призов, и у одного приза есть много вариантов. Когда я attemp, чтобы сохранить эту форму получите сообщение об ошибкеSymfony2 несколько встроенных форм от одного до многих обновить внешний ключ
SQLSTATE [23000]: Integrity нарушение ограничения: 1048 Колонка «fk_prize» не может быть пустым
Я уже установил в моей сущности на каскад и в моей форме типа set by_refference false, но не работал. Все остальные назначенные внешние ключи работают отлично.
ОБНОВЛЕНО: В контроллере, когда я делаю эту форму, сохранен успешно. Но я хочу сделать это с учением. Это ошибка в доктрине или что-то не так в моем коде? Спасибо за ваше время!
//Hacked code in controller to save the form
$prizes = $data->getPrizes();
foreach ($prizes as $prize) {
$prizeOptions = $prize->getPrizesOptions();
foreach ($prizeOptions as $prizeOption) {
$prizeOption->setPrize($prize);
}
}
$em->persist($data);
$em->flush();
<?php
class Game
{
/**
* @ORM\OneToMany(targetEntity="Prize", mappedBy="game", cascade={"persist"})
*/
protected $prizes;
public function __construct()
{
$this->gameUsers = new ArrayCollection();
$this->prizes = new ArrayCollection();
}
}
?>
<?php
class GameType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('alias', 'text' , [
'label'=>'Name'
])
->add('prizes' ,'collection', array(
'type' => new PrizeType($this->intention),
'allow_add' => true,
'allow_delete' => false,
'prototype' => true,
'by_reference' => false,
'label' => false,
))
->add('save', 'submit', [
'attr' => [
'class' => 'btn btn-primary'
]
]);
}
}
<?php
class Prize
{
/**
* The Game
* @ORM\ManyToOne(targetEntity="Game")
* @ORM\JoinColumn(name="game_id", referencedColumnName="id")
*/
protected $game;
/**
* @ORM\OneToMany(targetEntity="PrizeOptions", mappedBy="prize", cascade={"persist"})
*/
protected $prizes_options;
/**
* Constructor
*/
public function __construct()
{
$this->prizes_options = new \Doctrine\Common\Collections\ArrayCollection();
}
}
class PrizeType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('prizes_options' ,'collection', array(
'type' => new PrizeOptionsType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'label' => false,
))
;
}
}
<?php
class PrizeOptionsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text' , [
'label'=>'Value'
])
;
}
}