2016-09-24 1 views
2

私はデータベースに既存のエンティティを持っています。私は、このエンティティに新しい列を追加したい:私は今"vendor/bin/doctrine-migrate migrations:diff"を使用すると、生成された移行スクリプトがlanguage_idのデフォルト値が含まれていませんdoctrineの移行:nullにできないデフォルト値fk

/** 
* @ORM\ManyToOne(targetEntity="Language") 
* @ORM\JoinColumn(name="language_id", referencedColumnName="id", nullable=false) 
*/ 
protected $language; 

。したがって、移行スクリプトは失敗します。オブジェクト内のプロパティのデフォルト値を設定しても効果はありません。どのようにしてfk列のデフォルト値を定義できますか?私はdoctrinesのドキュメントやgoogle/stackoverflowで何も見つけませんでした。

+0

:ここでは正確なメッセージ移行スクリプトを実行している: '表registered_userがLANGUAGE_ID VARCHAR(255)、NOT NULLを追加するALTER' を実行しながら、 は '例外が発生しました: SQLSTATE [23502]:未nullの違反: 7 ERROR:column "language_id"にヌル値が含まれています。 – mscho

答えて

0

カラムがNULLでない場合は、有効な関係を表す必要があります。代わりに0を使用すると仮定すると、Doctrineはそれを使用して関連付けをロードしようとしますが、もちろん失敗します。このような場合、がnull値を許可するようにデータベースとマッピングを更新する必要があります。

ただし、デフォルトの言語のアソシエーションを定義する必要がある場合は、エンティティの作成時に明示的に設定する必要があります。このため

$language = $entityManager->find(1); 

$entity = new Entity; 
$entity->setLanguage($language); 

$entityManager->persist($entity); 
$entityManager->flush(); 

、あなたは言語は常に有効なると、デフォルトで割り当てられます知っているので、あなたのエンティティの作成をカプセル化する「サービス」を検討する必要があります。

+0

私が持っている問題は新しいエントリに関連するものではなく、すでに存在しています。生成されたマイグレーション・スクリプトにはlanguage_idのデフォルト値は含まれていませんが、not null制約が含まれています。したがって、移行は失敗します。 'ALTER TABLEの実行中に例外が発生しました。ADD language_id VARCHAR(255)NOT NULL ': SQLSTATE [23502]:NULL違反:7エラー:NULLの値を含む列" language_id " – mscho

0

これはきれいな方法ではないかもしれませんが、SQLクエリを自分で実行して手動でDEFAULT文を追加することはできますか?

ALTER TABLE registered_user ADD language_id VARCHAR(255) NOT NULL DEFAULT {default_value} WITH VALUES;

は私が注釈にデフォルトのプロパティを追加することがここで働いていないことは非常に驚いています!私の要求を強化するために

+0

これを試しました溶液。問題:次の移行スクリプトを生成するときに、デフォルト値が削除されます。 – mscho

+0

はい、これは単に列を追加して既存の行を更新するだけです。なぜか分からないけど、Doctrineはデフォルト値のSQL側を管理していないことも分かった。エンティティコンストラクタのデフォルト値を常に設定する必要があります(エンティティは永続化されているかどうか)。このデフォルト値が設定パラメータに依存する場合は、上記の答えに示唆されているように、マネージャ(サービス)を使用してエンティティを作成することをお勧めします。 – Boulzy

関連する問題