Symfony2, DoctrineFixturesBundle, не может загрузить приборы из-за ограничения внешнего ключа - PullRequest
7 голосов
/ 13 декабря 2011

У меня есть компания 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, чтобы отключить ключевые ограничения перед чисткой. Не очень долгосрочное решение.

Другие взаимосвязи в структуре данных не вызывают проблем, поскольку доктрина, кажется, очищается в правильном порядке, чтобы избежать проблем, но при наличии самоссылки таблицы Company она падает.

Вот мое существо.

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 Ответ

17 голосов
/ 13 декабря 2011

Мне просто нужно было правильно настроить поведение 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;
...