Doctrine 2 でデフォルト値を設定するにはどうすればよいですか?
15 に答える
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
*/
private $myColumn;
...
}
これはSQLを使用することに注意してください。これは、やなどDEFAULT
の一部のフィールドではサポートされていません。BLOB
TEXT
データベースのデフォルト値は「移植可能」にはサポートされていません。データベースの既定値を使用する唯一の方法は、フィールドがマップされる列のスニペット (原因を含む) をcolumnDefinition
指定するマッピング属性を使用することです。SQL
DEFAULT
以下を使用できます。
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
PHP レベルのデフォルト値は、新しく作成され永続化されたオブジェクトでも適切に利用できるため、優先されます (Doctrine は、デフォルト値を取得するために新しいオブジェクトを永続化した後、データベースに戻りません)。
エンティティにコンストラクターを設定し、そこにデフォルト値を設定します。
使用する:
options={"default":"foo bar"}
ではない:
options={"default"="foo bar"}
例えば:
/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
私が使用した回避策はLifeCycleCallback
. たとえば、「ネイティブ」メソッドが他にあるかどうかを確認するのをまだ待っています@Column(type="string", default="hello default value")
。
/**
* @Entity @Table(name="posts") @HasLifeCycleCallbacks
*/
class Post implements Node, \Zend_Acl_Resource_Interface {
...
/**
* @PrePersist
*/
function onPrePersist() {
// set default date
$this->dtPosted = date('Y-m-d H:m:s');
}
xml を使用して行うこともできます。
<field name="acmeOne" type="string" column="acmeOne" length="36">
<options>
<option name="comment">Your SQL field comment goes here.</option>
<option name="default">Default Value</option>
</options>
</field>
これが私が自分でそれを解決した方法です。以下は、MySQLのデフォルト値を持つエンティティの例です。ただし、これにはエンティティ内のコンストラクターのセットアップも必要であり、そこでデフォルト値を設定する必要があります。
Entity\Example:
type: entity
table: example
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
label:
type: string
columnDefinition: varchar(255) NOT NULL DEFAULT 'default_value' COMMENT 'This is column comment'
これはどれも私にとってはうまくいきませんでした。doctrine のサイトで、値を直接設定してデフォルト値を設定するように指示しているドキュメントを見つけました。
private $default = 0;
これにより、必要な値が挿入されました。
mysqlデータベースでも機能します:
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: integer
nullable: true
options:
default: 1
エンティティに yaml 定義を使用する場合、postgresql データベースでは次のように動作します。
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: boolean
nullable: false
options:
default: false
@romanb 素晴らしい回答に追加します。
null 制約がなく、デフォルト値のないフィールドを作成することは明らかにできないため、これにより移行に少しオーバーヘッドが追加されます。
// this up() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");
//lets add property without not null contraint
$this->addSql("ALTER TABLE tablename ADD property BOOLEAN");
//get the default value for property
$object = new Object();
$defaultValue = $menuItem->getProperty() ? "true":"false";
$this->addSql("UPDATE tablename SET property = {$defaultValue}");
//not you can add constraint
$this->addSql("ALTER TABLE tablename ALTER property SET NOT NULL");
この回答で、そもそもなぜデータベースのデフォルト値が必要なのか考えてみてください。そして通常、null 制約なしでオブジェクトを作成できるようにすることです。
コンストラクターで値を設定しても機能しますが、Doctrine Lifecycle イベントを使用する方がより良い解決策になる場合があります。
ライフサイクル イベントを活用するprePersist
ことで、初期永続化時にのみエンティティにデフォルト値を設定できます。