Подчиненная форма 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
            ) ));
    }

0 ответов

Другие вопросы по тегам