Doctrine 2首先刷新了错误的实体

时间:2017-01-26 10:28:41

标签: doctrine-orm

我有这个数据库设计,在某些情况下,Doctrine 2在插入顺序中做出正确的决定,有时候不是

enter image description here

我有一个自动导入过程,可以在数据提供者更改数据时导入和更新数据。字段item.something_happened_item_history_id是导致问题的新字段

开始导入时

步骤1.数据库中没有数据,我创建了一个项目和一个item_history,其中item_history.item_id是item.id,item.something_happened_item_history_id为null。现在我做Flush和Doctrine可以弄清楚它需要在item_history之前插入项目。一切都很好。

步骤2.现在有一个新的导入,并且步骤1中的数据库中已经存在一些数据。但是在新的导入中,我实际上有一个新的唯一项目。所以我所做的是我完全按照步骤1创建项目和item_history。但是由于某些原因,在Flush Doctrine期间认为item_history需要在项目之前保存。由于item_history上没有可空的外键引用,因此无法完成。

据我所知,Doctrine根据外键引用做出决定,而且thing_happened_item_history_id字段导致了问题。但它不会在步骤1中造成任何问题。当数据库中已经有一些数据加载到entityManager中时会出现问题。

我还没有弄清楚如何操纵Doctrine 2,以便它总是在item_history之前保存该项目。

任何想法如何解决?

因为我真的不想改变我的数据库设计,因为Doctrine 2无法找出插入顺序。

此外,不能选择执行更多刷新,因为在数据进入数据库之前已经完成了大量数据验证。我不希望数据库中有任何损坏的数据。

最诚挚的问候, 亨德里克

编辑:Doctrine 2制图

/**
 * @Table(name="item", uniqueConstraints={@UniqueConstraint(name="uc_something_happened_item_history", columns={"something_happened_item_history_id"})})
 **/
class Item
{
    /** @Id @Column(name="id", type="integer", options={"unsigned":true}) @GeneratedValue **/
    protected $id;

    /**
     * @OneToMany(targetEntity="ItemHistory", mappedBy="item")
     **/
    protected $itemHistories;


    /**
     * @OneToOne(targetEntity="ItemHistory")
     * @JoinColumn(name="something_happened_item_history_id", referencedColumnName="id", nullable=true, unique=true)
     **/
    protected $somethingHappenedItemHistory;
}

/**
 * @Table(name="item_history")
 **/
class ItemHistory
{
    /** @Id @Column(name="id", type="integer", options={"unsigned":true}) @GeneratedValue **/
    protected $id;

    /**
     * @ManyToOne(targetEntity="Item", inversedBy="itemHistories")
     * @JoinColumn(name="item_id", referencedColumnName="id", nullable=false)
     **/
    protected $item;
}

1 个答案:

答案 0 :(得分:0)

我没有按照我想要的方式解决问题。

但是通过使item_id可以为空,那么Doc​​trine能够完成刷新。 数据在数据库中也是正确的。