Значение по умолчанию в доктрине - PullRequest
312 голосов
/ 31 июля 2010

Как мне установить значение по умолчанию в Doctrine 2?

Ответы [ 15 ]

485 голосов
/ 02 августа 2012
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
     */
    private $myColumn;
    ...
}

Обратите внимание, что здесь используется SQL DEFAULT, который не поддерживается для некоторых полей, таких как BLOB и TEXT.

363 голосов
/ 31 июля 2010

Значения по умолчанию для базы данных не «переносимы».Единственный способ использовать значения по умолчанию для базы данных - через атрибут сопоставления columnDefinition, где вы указываете фрагмент SQL (DEFAULT причина включительно) для столбца, в который отображается поле.

Вы можете использовать:

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

Предпочтительны значения по умолчанию на уровне PHP, поскольку они также правильно доступны для вновь создаваемых и сохраняемых объектов (Doctrine не вернется в базу данных после сохранения нового объекта для получения значений по умолчанию).

61 голосов
/ 07 марта 2011

Установите конструктор в вашей сущности и установите там значение по умолчанию.

53 голосов
/ 13 марта 2013

Использование:

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

а не:

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

Например:

/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
50 голосов
/ 18 февраля 2014

Обновление

Еще одна причина, по которой читает документацию для Symfony, никогда не выйдет из моды.В моем конкретном случае есть простое решение: установить для параметра field type empty_data значение по умолчанию.

Опять же, это решение предназначено только для сценария, в котором пустой ввод в форме устанавливаетПоле БД для null.

Фон

Ни один из предыдущих ответов не помог мне с моим конкретным сценарием, но я нашел решение.

У меня было поле формы, которое нужно было вести себяследующим образом:

  1. Не требуется, можно оставить пустым.(Используется 'required' => false)
  2. Если оставить это поле пустым, по умолчанию должно быть задано значение.Для удобства пользователей я не установил значение по умолчанию для поля ввода, а использовал атрибут html 'placeholder', поскольку он менее навязчив.

Затем я попробовал все рекомендации, приведенные здесь.Позвольте мне перечислить их:

  • Установить значение по умолчанию, когда для свойства объекта:
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @Column(name="myColumn", type="string", length="50")
     */
    private $myColumn = 'myDefaultValue';
    ...
}
  • Использовать аннотацию параметров:
@ORM\Column(name="foo", options={"default":"foo bar"})
  • Установите значение по умолчанию для конструктора:
/**
 * @Entity
 */
class myEntity {
    ...
    public function __construct()
    {
        $this->myColumn = 'myDefaultValue';
    }
    ...
}
Ничего из этого не сработало, и все из-за того, как Symfony использует ваш класс Entity.

ВАЖНО

Поля формы Symfony переопределяют значения по умолчанию, установленные в классе Entity. Это означает, что в вашей схеме для вашей БД может быть определено значение по умолчанию, но если вы оставите необязательное полепусто при отправке формы, form->handleRequest() внутри вашего form->isValid() метода переопределит эти значения по умолчанию в вашем классе Entity и установит для них значения поля ввода.Если значения поля ввода не заполнены, для свойства Entity будет установлено значение null.

http://symfony.com/doc/current/book/forms.html#handling-form-submissions

Мой обходной путь

Установите значение по умолчанию наваш контроллер после form->handleRequest() внутри вашего form->isValid() метода:

...
if ($myEntity->getMyColumn() === null) {
    $myEntity->setMyColumn('myDefaultValue');
}
...

Не красивое решение, но оно работает.Я мог бы сделать validation group, но могут быть люди, которые рассматривают эту проблему как преобразование данных вместо проверки данных , я оставляю вам решать.


Установщик переопределения (не работает)

Я также попытался переопределить установщик Entity следующим образом:

...
/**
 * Set myColumn
 *
 * @param string $myColumn
 *
 * @return myEntity
 */
public function setMyColumn($myColumn)
{
    $this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;

    return $this;
}
...

Это, даже если он выглядит чище, это не работает .Причина в том, что злой form->handleRequest() метод не использует методы установки модели для обновления данных (подробнее см. form->setData()).

16 голосов
/ 31 июля 2010

Обходной путь, который я использовал, был 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');
}
12 голосов
/ 23 января 2015

Вы также можете сделать это, используя 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>
7 голосов
/ 09 декабря 2013

У меня работает и в базе данных mysql:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: integer
            nullable: true
            options:
                default: 1
7 голосов
/ 10 августа 2011

Вот как я решил это для себя.Ниже приведен пример Entity со значением по умолчанию для 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'
6 голосов
/ 17 июля 2014

Ничего из этого не сработало для меня. Я нашел некоторую документацию на сайте доктрины, в которой говорится, что нужно установить значение напрямую, чтобы установить значение по умолчанию.

http://doctrine -orm.readthedocs.io / проекты / Доктрина-ОРМ / ен / последний / ссылка / faq.html

private $default = 0;

Это вставило значение, которое я хотел.

...