375

Doctrine 2 でデフォルト値を設定するにはどうすればよいですか?

4

15 に答える 15

640
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
     */
    private $myColumn;
    ...
}

これはSQLを使用することに注意してください。これは、やなどDEFAULTの一部のフィールドではサポートされていません。BLOBTEXT

于 2012-08-02T11:05:52.757 に答える
420

データベースのデフォルト値は「移植可能」にはサポートされていません。データベースの既定値を使用する唯一の方法は、フィールドがマップされる列のスニペット (原因を含む) をcolumnDefinition指定するマッピング属性を使用することです。SQLDEFAULT

以下を使用できます。

<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @Column(name="myColumn", type="string", length="50")
     */
    private $myColumn = 'myDefaultValue';
    ...
}

PHP レベルのデフォルト値は、新しく作成され永続化されたオブジェクトでも適切に利用できるため、優先されます (Doctrine は、デフォルト値を取得するために新しいオブジェクトを永続化した後、データベースに戻りません)。

于 2010-07-31T19:41:20.750 に答える
65

エンティティにコンストラクターを設定し、そこにデフォルト値を設定します。

于 2011-03-07T15:43:19.160 に答える
59

使用する:

options={"default":"foo bar"}

ではない:

options={"default"="foo bar"}

例えば:

/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
于 2013-03-13T10:39:47.813 に答える
18

私が使用した回避策は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');
}
于 2010-07-31T13:23:00.053 に答える
14

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>
于 2015-01-23T14:44:06.023 に答える
8

これが私が自分でそれを解決した方法です。以下は、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'
于 2011-08-10T15:45:12.097 に答える
8

これはどれも私にとってはうまくいきませんでした。doctrine のサイトで、値を直接設定してデフォルト値を設定するように指示しているドキュメントを見つけました。

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column

private $default = 0;

これにより、必要な値が挿入されました。

于 2014-07-17T15:15:55.663 に答える
7

mysqlデータベースでも機能します:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: integer
            nullable: true
            options:
                default: 1
于 2013-12-09T03:53:25.070 に答える
3

エンティティに yaml 定義を使用する場合、postgresql データベースでは次のように動作します。

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: boolean
            nullable: false
            options:
                default: false
于 2013-09-12T09:15:15.770 に答える
3

@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 制約なしでオブジェクトを作成できるようにすることです。

于 2012-08-30T08:31:29.647 に答える
1

コンストラクターで値を設定しても機能しますが、Doctrine Lifecycle イベントを使用する方がより良い解決策になる場合があります。

ライフサイクル イベントを活用するprePersistことで、初期永続化時にのみエンティティにデフォルト値を設定できます。

于 2016-01-08T22:19:41.693 に答える