Слияние создает новую запись для детей - PullRequest
0 голосов
/ 17 ноября 2018

Объединение создает не работает для детей @ OneToMany

Я использую Php Doctrine и использую @OnToMany сопоставление с cascade all. У меня есть родительский класс SalesOrder и дочерний класс SalesOrderDetails.

  1. Case 1 : Save - Когда я сохраняю новый рекордный заказ на продажу вместе с деталями заказа на продажу. Работает как положено.
  2. Case 2 : Update - Вот проблема, я объединяю Sales Order, что хорошо, однако он вставляет новые записи для своих дочерних элементов SalesOrderDetail вместо обновления. В идеале это должно применяться merge, но также и для детей, но это не так.

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

Примечание: 1. Merge работает с родительским объектом, если он имеет значение id. 2. Я не добавляю новый элемент здесь, я просто обновляю существующие записи с помощью слияния.

SalesOrder.php

/**
 * @Entity @Table(name="sales_orders")
 * */
class SalesOrder extends BaseEntity {
       /**
       * @OneToMany(targetEntity="SalesOrderDetail",cascade="all", mappedBy="salesOrder" )
       */
       protected $itemSet;

           function __construct() {
                $this->itemSet = new ArrayCollection();
          }
}

SalesOrderDetail.php

/**
 * @Entity @Table(name="sales_order_details")
 * */
class SalesOrderDetail extends BaseEntity {

    /** @Id @Column(type="integer") @GeneratedValue * */
    protected $id;

    /**
     * @ManyToOne(targetEntity="SalesOrder")
     * @JoinColumn(name="order_no", referencedColumnName="order_no")
     */
    protected $salesOrder;

}

enter image description here

Экран режима отладки

enter image description here

Если я использую cascade={"merge"}

Я получаю другую ошибку, если использую каскады merge

Тип: Doctrine \ ORM \ ORMInvalidArgumentException Сообщение: несколько непостоянные новые объекты были найдены через данную ассоциацию график: * Новая связь была найдена через отношения 'Ziletech \ Database \ Entity \ SalesOrder # itemSet', который не был настроен для каскадного сохранения операций для объекта: Ziletech \ Database \ Entity \ SalesOrderDetail @ 0000000052218380000000007058b4a6. Чтобы решить эту проблему: либо явно вызовите EntityManager # persist () на этот неизвестный объект или настроить каскад сохраняют эту связь в отображение, например, @ManyToOne (.., cascade = {"persist"}). если ты не может выяснить, какой объект вызывает проблему реализовать 'Ziletech \ Database \ Entity \ SalesOrderDetail #__ toString ()', чтобы получить Подсказка. * Новая связь была найдена через отношения 'Ziletech \ Database \ Entity \ SalesOrder # itemSet', который не был настроен для каскадного сохранения операций для объекта: Ziletech \ Database \ Entity \ SalesOrderDetail @ 0000000052218071000000007058b4a6. Чтобы решить эту проблему: либо явно вызовите EntityManager # persist () на этот неизвестный объект или настроить каскад сохраняют эту связь в отображение, например, @ManyToOne (.., cascade = {"persist"}). если ты не может выяснить, какой объект вызывает проблему реализовать 'Ziletech \ Database \ Entity \ SalesOrderDetail #__ toString ()', чтобы получить ключ.

1 Ответ

0 голосов
/ 18 ноября 2018

В вашем отображении есть ошибка, cascade нужен массив

/**
 * @OneToMany(targetEntity="SalesOrderDetail", cascade={"all"}, mappedBy="salesOrder" )
 */
 protected $itemSet;
...