由于外键约束,Symfony2,DoctrineFixturesBundle无法加载fixture

时间:2011-12-13 09:42:39

标签: symfony doctrine-orm foreign-keys

我有一个公司实体,其中每个公司都有一个分层树结构中的另一个母公司。

在应用程序中一切正常,所以我确定我的实体类是正确的。

问题是,如果数据库中已有内容,则执行

doctrine:fixtures:load

给出了这个错误:

[PDOException]                                                                                                                                                                                                                                              
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails

我相当确定问题是load:fixtures必须截断表,但它不能得到这个错误。

我不知道如何解决这个问题,而不在黑客攻击Doctrine中以禁用清除之前的关键约束。这不是一个长期的解决方案。

数据结构中的其他关系不会导致问题,因为学说似乎以正确的顺序清除以避免问题,但是当公司表自我引用时,它就会失败。

继承我的实体。

class Company
{
/**
 * @var integer $id
 *
 * @ORM\Id
 * @ORM\Column(name="id", type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
* @var string $name
* @ORM\Column(type="string", length=100)
*/    
protected $name;

/**
 * @ORM\ManyToOne(targetEntity="Company", inversedBy="children")
 * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
 */
protected $parent;

/* other properties here..... */

}

我正在使用Symfony 2.0.7和最新的deps,以及MySQL 5.5

1 个答案:

答案 0 :(得分:17)

我只需要正确设置OnDelete的行为。

默认为RESTRICT,它解释了抛出的错误。将其显式设置为CASCADE或SET NULL允许doctrine清空表而没有错误。

在我的情况下,我不想删除父项导致删除子项,所以我使用SET NULL,以便只删除关系。

/**
 * @ORM\ManyToOne(targetEntity="Company", inversedBy="children")
 * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="set null")
 */
protected $parent;