Подчиненная форма symfony2, один ко многим, сохраняется только в том случае, если ее не существует
Я знаю, что видел ответ на вопрос в том же духе несколько дней назад, но после 2 часов поиска без удачи, я спрашиваю снова. Сожалею.
У меня есть форма, AlertType, которая вызывает подчиненную форму StockType посредством
->add('stock', new StockType(), array(
"em" => $em,
));
и мой StockType
$em = $options['em'];
$transformer = new TickerToStockTransformer($em);
$builder
->add(
$builder->create('ticker', 'text')
//->addModelTransformer($transformer)
)
->add('exchange')
;
Моя модель трансформера выглядит так:
class TickerToStockTransformer implements DataTransformerInterface
{
/**
* @var ObjectManager
*/
private $om;
/**
* @param ObjectManager $om
*/
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
/**
* Transforms an object (stock) to an int (id).
*
* @param Stock|null $stock
* @return integer
*/
public function transform($stock)
{
if (null === $stock) {
return "";
}
return $stock->getId();
}
/**
* Transforms an integer (id) to an object (stock).
*
* @param integer $id
* @return Stock|null
* @throws TransformationFailedException if object (stock) is not found.
*/
public function reverseTransform($id)
{
if (!$id) {
return null;
}
$stock = $this->om
->getRepository('TSNStatsBundle:Stock')
->findOneById($id)
;
if (null === $stock) {
throw new TransformationFailedException(sprintf(
'A stock with number "%s" does not exist!',
$id
));
}
return $stock;
}
Мой контроллер довольно стандартный:
$em = $this->getDoctrine()
->getEntityManager();
$guru = $this->getRequest()->request->all();
$guru =$guru['tsn_statsbundle_alerttype']['guru'];
$guru = $em->getRepository("TSNStatsBundle:Guru")->find($guru);
$time = new \DateTime(2012-12-30);
$time->setTime(23,59);
$alert = new Alert();
$alert->setText($time)
->setEmail($time)
->setTwitter($time)
->setChat($time);
$request = $this->getRequest();
$form = $this->createForm(new AlertType(), $alert, array(
"em" =>$this->getDoctrine()->getEntityManager(),
'guru' => $guru,
));
$form->bindRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()
->getEntityManager();
$em->persist($alert);
$em->persist($alert->getStock());
$em->flush();
return $this->redirect($this->generateUrl('new_alert', array(
'guru' => 2
) ));
}
Я в настоящее время не использую трансформатор, потому что это, казалось, было бесполезно. (Я знаю, что это говорит FindOneById, и это на тикере (текст). Я также попытался сделать byTicker, и это тоже не работает)
У меня есть отношения один к одному с одной акцией, способной иметь много предупреждений.
Форма работает прекрасно, пока я не попытаюсь сохранить "предупреждение", где "запас" уже существует. Как я могу сохраняться, только если акции не существует, в противном случае просто используйте ссылку?
РЕДАКТИРОВАТЬ: Хорошо, поэтому я взломал свой блок isValid, чтобы он работал, но это ужасно. Есть ли способ лучше?
if ($form->isValid()) {
$em = $this->getDoctrine()
->getEntityManager();
if ($em->getRepository('TSNStatsBundle:Stock')->findOneByTicker($alert->getStock()->getTicker()))
$alert->setStock($em->getRepository('TSNStatsBundle:Stock')->findOneByTicker($alert->getStock()->getTicker()));
$em->persist($alert);
$em->flush();
return $this->redirect($this->generateUrl('new_alert', array(
'guru' => 2
) ));
}