合并正在为孩子创造新记录

时间:2018-11-17 13:40:17

标签: php doctrine-orm doctrine

合并创建对儿童@OneToMany无效

我正在使用Php主义,并且正在将@OnToManycascade all映射。我有一个父类SalesOrder和一个子类SalesOrderDetails

  1. Case 1 : Save-当我保存新记录的销售订单以及销售订单详细信息时。它按预期工作。
  2. Case 2 : Update-这是问题,我正在合并Sales Order,这很好,但是它会为其子项SalesOrderDetail插入新记录而不是对其进行更新。理想情况下,它应该适用于merge,但也适用于儿童,但不适用于儿童。

到目前为止,我从数据库获取ID的销售订单明细,然后更改其属性。理想情况下不是这样,这意味着如果将id设置为无人对象,则应该更新ID而不是创建新记录。

注意: 1.如果合并具有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"}

如果我使用Cascades 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 :(得分:1)

您的映射有误,cascade needs an array

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