Объединение создает не работает для детей @ OneToMany
Я использую Php Doctrine и использую @OnToMany
сопоставление с cascade
all
. У меня есть родительский класс SalesOrder
и дочерний класс SalesOrderDetails
.
Case 1 : Save
- Когда я сохраняю новый рекордный заказ на продажу вместе с деталями заказа на продажу. Работает как положено.
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;
}
Экран режима отладки
Если я использую 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 ()', чтобы получить
ключ.