2016-04-07 11 views
2

symfony2でデフォルト値を設定する方法を知りたければ、hereを見てください。オプション属性によってデフォルト値を設定し、変数に直接設定することの違いは何ですか?

私は両方の方法で設定できます。例えば、私はこれを直接変数に設定することができます。

/** 
* @var string $variable 
* 
* @ORM\Column(name="variable", type="string", nullable=true) 
*/ 
private $variable = "default_value"; 

または私はオプションを使用することができます

/** 
* @var string $variable 
* 
* @ORM\Column(name="variable", type="string", nullable=true,options={"default" = "default_value"}) 
*/ 
private $variable = "default_value"; 

属性私はこれらの2の各W/Bの違いは何か知りたいです。さらに重要なのは、最初の方法では十分ではない場合があり、options属性を使用する必要があるということです。

これまでに知ったことから、変数を直接設定すると、symfony2レベルでデフォルト値が設定され、options属性によってdoctrineに設定されます。 ORMレベルのデフォルト値を設定するのはどのような違いがありますか?symfony2のデフォルトとはいつ衝突しますか?私が2つのうちの1つだけを使うとどうなりますか?

+4

この質問は既に回答済みです。http://stackoverflow.com/questions/3376881/default-value-in-doctrine –

+0

この2つのアプローチの違いを知りたいと思います。私はそこに答えがあるとは思わない、違いを説明し、2人のうちの1人が十分でない場合。もしあれば、指摘するほど親切にしてください。 – Shrey

答えて

0

違いは違いは、値が異なるレベルに設定されていることです。具体的には、次のようにしてデフォルト値を作成する場合:

/** 
* @var string $variable 
* 
* @ORM\Column(name="variable", type="string", nullable=true) 
*/ 
private $variable = "default_value"; 

いつデフォルト値で新しいオブジェクトを作成しますか?

$a = new MyClass(); 
$a->getVariable(); // -> 'default_value' 

したがって、実際のデフォルト値にはすぐにアクセスできます。あなたは第二のアプローチを使用する場合:

/** 
* @var string $variable 
* 
* @ORM\Column(name="variable", type="string", nullable=true,options={"default" = "default_value"}) 
*/ 
private $variable; 

これは

私が言うあなたが実体

$a = new MyClass(); 
$a->getVariable(); // -> null 
$em->perist($a); 
$em->flush(); 
$a->getVariable(); // -> 'default_value' 
を保存した後、値がアクセスできるようになりますので、DBのスキーマは、列のデフォルト値が含まれますことを引き起こしますこれが基本的な違いです。実際には、デフォルト値をどこで制御したいのか、いつ設定したいのかによって異なります。

私の意見では、ほとんどの場合、エンティティ自体の割り当ては、後でシステムで値を変更したい場合は、エンティティの値を更新するだけで済みます。

あなたが別の値に更新する注釈を更新してから、DBフィールドに

UPDATE(マイグレーション質問を既定値を変更するために、移行を作成する必要があります、その後、データベースにデフォルトを使用する場合)

あなたはDoctrineの注釈で指定されたデフォルト値を使用して、symfonyプロジェクトのためにDoctrineのマイグレーションバンドルを使用していて、あなたが)ないphp app/console doctrine:migrations:diffを使用することによって(手動でこのクラスの移行を書きます、あなたが指定する必要がある場合にはオプションとしてデフォルトを手動で入力します。注釈そのものは、列の定義がどのように表示されるかを示します。

デフォルト値がPHPでのみ設定されている場合、つまり、private $variable = 'default_value';マイグレーションバンドルはまったく影響を受けません。つまり、php app/console doctrine:migrations:diffを実行した場合、フィールドの値はDEFAULTになりません。もちろん、自分でマイグレーションを書き込むと、データベースのデフォルト値は自動的に書き込まれます。

マイグレーションバブル機能を合計すると、自動的に生成されたマイグレーションは、@ORM\Columnアノテーションのデフォルト値の影響を受けます。

+0

ありがとうございます。ちょうど私が必要なもの。あともう一つだけ。 ** symfonyレベルのデフォルト**しか使用していない場合は、エンティティ作成の移行に影響しますか? たとえば、マイグレーションでデフォルト値を指定しないと、symfonyレベルのデフォルトを選択できるのでしょうか、それともoptions属性を設定する必要がありますか? – Shrey

+0

私は答えを更新しました。 ** symfonyのデフォルトの**デフォルトではDoctrine @Columnアノテーションのデフォルトを意味します。アップデートで説明したように、手動でマイグレーションを実行する場合は、もちろん自分でカラムを指定する必要があります。 'php app/console doctrine:migrations:diff'コマンドを使って自動的にマイグレーションを生成すると、それが処理されます。しかし、とにかく私は上記のように、PHPレベルのデフォルトを使用することを提案します。 –

+0

いいえ、symfonyレベルのデフォルトでは、私はprivate $ variable = "false"を意味します。 – Shrey

関連する問題