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

标签 symfony doctrine-orm foreign-keys

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

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

问题是,如果数据库中已经有内容,那么做

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

最佳答案

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

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

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

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

关于Symfony2,DoctrineFixturesBundle,由于外键约束无法加载夹具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8487042/

相关文章:

doctrine-orm - 如何在 Native Query COLUMNS 上使用 Doctrine2 类型转换

mysql - 具有引用其他外键字段的外键字段的表的 SQL 查询

sql - 一个表中的多个外键链接到第二个表中的单个主键

sql - Doctrine DQL 每组最大 n

Symfony2 - 在实体操作上添加 flashbag 消息

doctrine-orm - 有没有办法在 Zend Framework 2 中将 Firebird/Ibase 与 Doctrine 一起使用?

symfony - SonataAdminBundle - 检查 `preUpdate` Hook 中的更改

c# - 建模多态关联数据库优先与代码优先

symfony - 多对多,Doctrine的实体生成器和复数化

带有 docker 卷的 PHP 命令不起作用