2011-12-13 4 views
7

私は、各社が階層ツリー構造の別の親会社を持っている会社エンティティを持っています。外国語のキー制約のため、Symfony2のDoctrineFixturesBundleは什器をロードできません

すべてがアプリケーションで正常に動作するため、エンティティクラスが正しいと確信しています。

問題は、コンテンツは、データベースにすでに存在する場合

doctrine:fixtures:load 

を行うことは、このエラーを与え、次のとおりです。備品切り捨てることがあります。問題は、負荷があることである

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

イムかなり確認してくださいこのエラーは発生しません。

パージの前にキー制約を無効にするためにDoctrineに何かをハッキングすることなくこれを解決する方法がわかりません。長期的な解決策ではありません。

データ構造内の他の関係は、問題を引き起こすことはありません。なぜなら、問題を回避するために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

答えて

16

私はちょうど適切OnDeleteの動作を設定する必要がありました。

デフォルトでは、RESTRICTが発生します。これは、投げられるエラーを説明しています。明示的にそれをCASCADEまたはSET NULLに設定すると、doctrineはエラーなしでテーブルを空にできます。

私の場合、親を削除して子を削除したくないので、SET NULLを使用してリレーションシップを代わりに削除しました。

+0

私は別のエラーメッセージがありました:* [...] * \ Entity \ [...] *のクエリで識別子[...]が見つかりません。この答えは解決策でしたが、3年後(Symfony 2.3.25で)まだ有効です。ありがとう! –