我有这个数据库设计,在某些情况下,Doctrine 2在插入顺序中做出正确的决定,有时候不是
我有一个自动导入过程,可以在数据提供者更改数据时导入和更新数据。字段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;
}
答案 0 :(得分:0)
我没有按照我想要的方式解决问题。
但是通过使item_id可以为空,那么Doctrine能够完成刷新。 数据在数据库中也是正确的。