Создание новой записи, а не обновление старой записи с помощью Doctrine2 - PullRequest
0 голосов
/ 19 ноября 2011

Сейчас я использую Doctrine2 в сочетании с Symfony2. У меня есть объект с именем «OrderRequest», который содержит две ссылки на другой тип записи с именем «OrderRequestPerson» (это поля «Заказчик» и «Получатель»). В моей форме пользователь имеет возможность установить orderer = receive или заполнить информацию о получателе.

У меня есть ошибка в данном конкретном случае: заказ размещается там, где orderer = получатель, поэтому в базе данных поля orderer и получатель имеют одинаковое значение (15 в данном случае, ссылаясь на идентификатор OrderRequestPerson). Если администратор заходит и обновляет заказ до того места, где заказчик! = Получатель, мне нужно обновить поле получателя. В настоящее время менеджер сущностей обновит OrderRequestPerson с идентификатором 15, который, следовательно, обновит как заказчика, так и получателя. Есть ли способ, которым я могу сказать Doctrine2 / Symfony2 создать новую запись для получателя с новым идентификатором и поместить информацию в эту запись вместо обновления информации о заказчике?

Мой код размещен ниже:

    //  Get the entity manager.
    $em = $this->getDoctrine()->getEntityManager();

    //  Grab the order.
    $order = $em->getRepository('OrderRequestBundle:OrderRequest')
                ->getOrder($id);

    //  Get important information.
    $request = $this->getRequest();

    //  Create the OrderRequest form.
    $form = $this->get('form.factory')->create(new OrderRequestType(), $order);

    //  Fill the form with the request information.
    $form->bindRequest($request);

    //  Save the information.
    $em->flush();

1 Ответ

1 голос
/ 22 ноября 2011

В основном вам нужно отсоединить сущность от менеджера сущностей, а затем сохранить ее снова, что заставит ее вставляться как новую.

$person = $order->getReceiver();
$em->detach($person);
$em->persist($person);
$order->setReceiver($person);

Теперь проблема в том, что вы должны сделать толькочто если форма собирается изменить один или другой независимо.

Я думаю, вы могли бы сделать это всегда перед привязкой формы, а затем, если вы видите, что и получатель и заказчик содержат одни и те же данные, вы отбрасываетеполучатель (не забудьте удалить или хотя бы отсоединить его от $em) и снова назначить получателя в качестве получателя.

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

Вы можете прочитать больше о detach в доктрине документов .

...