Отношения при обновлении сущности в Symfony2 - один-к-одному и один-ко-многим не работает

1

У меня проблема с обновлением сущности (она обратная сторона) в форме, в то время как объект должным образом обновляется всеми данными, связанные с ним другие объекты не являются, то есть в базе данных их столбец, ссылающийся на "основной" объект, остается null или данные остаются нетронутыми.

Вот код:

class Offer
{
 /**
 * @var ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="DealOption", mappedBy="offer", cascade={"persist"})
 */
private $dealOptions;

/**
 * @var Event
 *
 * @ORM\OneToOne(targetEntity="Event", inversedBy="offer")
 * @ORM\JoinColumn(name="event_id", referencedColumnName="id")
 */
private $event;
}


class DealOption
{
/**
 * @var Offer
 *
 * @ORM\ManyToOne(targetEntity="Offer", inversedBy="dealOptions")
 * @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="SET NULL")
 */
private $offer;
}


class Event
{
/**
 * @var Offer
 *
 * @ORM\OneToOne(targetEntity="Offer", mappedBy="event")
 * @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="SET NULL")
 */
private $offer;

И действие обновления:

public function updateAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('AppBundle:Offer')->find($id);
    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Offer.');
    }

    $deleteForm = $this->createDeleteForm($id);
    $editForm = $this->createEditForm($entity);
    $editForm->handleRequest($request);

    if ($editForm->isValid()) {

        $em->persist($entity);
        $em->flush();
        return $this->redirect($this->generateUrl('offer'));
    }

    return array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    );
}

Согласно моим исследованиям и чтению аналогичных проблем с документацией, он должен работать так, как есть, однако это не так, я подозреваю, что некоторые основные недоразумения в моей части того, как эти отношения должны вести себя, работать и быть определенными, но до сих пор нет буено и нет Сукчес. Я был бы благодарен за любой совет.

Изменить - OfferFormBuilder:

class OfferType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('dealOptions')
        ->add('title')
        ->add('event')
        ->add('division')
    ;
}
  • 0
    Используете ли вы подчиненные формы для сущностей DealOption и Event? Не могли бы вы опубликовать свой код определения формы?
  • 0
    Я отредактировал вопрос и добавил OfferType (Form Builder).
Теги:
orm
doctrine

1 ответ

1
Лучший ответ

Нуль указывает, что вы не перекрестно ссылаетесь на объекты должным образом. Это очень распространенная ошибка.

class Offer {
  public function setEvent($event) {
    $this->event = $event;
    $event->setOffer($this); // *** This is what you are probably missing.

Сделайте то же самое для сделок.

  • 0
    Спасибо, вы были правы, это вышеупомянутое утверждение отсутствовало в setEvent и setDealOption, однако после добавления и повторного запуска тестового обновления он все равно не обновляет столбец offer_id. Тем временем мне также удалось просто зациклить связанные сделки и установить их в updateAction, и это работает частично, потому что он просто добавляет новые данные в offer_id, а не заменяет их. :) отредактировано в updateAction: if ($editForm->isValid()) { foreach($entity->getDealOptions() as $dealOpt){ $entity->setDealOptions($dealOpt); }
  • 0
    Вы действительно не хотите делать такой цикл. Так как это отношение один ко многим, то я ожидаю, что у вас будет метод Offer :: addDeal. Важно наладить отношения правильно, иначе у вас будет много других проблем.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню