Значение по умолчанию в Доктрине

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

Комментарии к вопросу (4)
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
     */
    private $myColumn;
    ...
}

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

Комментарии (11)
Решение

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

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

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

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

Комментарии (10)

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

Комментарии (6)

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

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

а не:

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

Например:

/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
Комментарии (1)

Обновление ##

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

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

Фон

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

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

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

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

  • Установить значение по умолчанию для объекта недвижимости:
<?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 использует ваш класс сущности.

Важно

Поля форм в Symfony переопределить значения по умолчанию, установленные на класс сущностей. Смысл, ваши схемы БД может иметь значение по умолчанию, но если вы оставите необязательное поле пустым при отправке формы, в форму-и GT;метод handlerequest()внутриформа->функция IsValid()метод переопределить эти значения по умолчанию налицокласса и их значений входных полей. Если в поле ввода значения пустым, тогда он будет установитьобъектаимуществануль`.

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

Мой Обходной

Установить значение по умолчанию на контроллере после форма->метод handlerequest () внутри формы-и вашГТ;функция IsValid () метод:

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

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


Переопределить Сеттер (Не Работает)

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

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

    return $this;
}
...

В этом, хоть это и выглядит чище, она doesn't работа. Причина в том, что зло форма-и GT;метод handlerequest() метод не использует модель'ы сеттер методы для обновления данных (копаться в форму-и GT;метод setdata () для более подробной информации).

Комментарии (5)

В качестве обходного пути я использовал 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');
}
Комментарии (2)

Вы можете сделать это с помощью XML, а также:



        Your SQL field comment goes here.
        Default Value

Комментарии (0)

Вот как я решил это для себя. Ниже приведен пример объекта со значением по умолчанию для 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'
Комментарии (3)

У меня работает на базе данных MySQL также:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: integer
            nullable: true
            options:
                default: 1
Комментарии (1)

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

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/faq.html

private $default = 0;

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

Комментарии (4)

Если вы используете определение и YAML для Вашего лица, следующие работы для меня на базе данных PostgreSQL:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: boolean
            nullable: false
            options:
                default: false
Комментарии (1)

Добавив к @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 ограничение.

Комментарии (1)

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

<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Steffen
 * Date: 27-6-13
 * Time: 15:36
 * To change this template use File | Settings | File Templates.
 */

require_once 'bootstrap.php';

$em->getConfiguration()->setMetadataDriverImpl(
    new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
        $em->getConnection()->getSchemaManager()
    )
);

$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($em->getConnection()->getSchemaManager());
$driver->setNamespace('Models\\');

$em->getConfiguration()->setMetadataDriverImpl($driver);

$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();

// Little hack to have default values for your entities...
foreach ($metadata as $k => $t)
{
    foreach ($t->getFieldNames() as $fieldName)
    {
        $correctFieldName = \Doctrine\Common\Util\Inflector::tableize($fieldName);

        $columns = $tan = $em->getConnection()->getSchemaManager()->listTableColumns($t->getTableName());
        foreach ($columns as $column)
        {
            if ($column->getName() == $correctFieldName)
            {
                // We skip DateTime, because this needs to be a DateTime object.
                if ($column->getType() != 'DateTime')
                {
                    $metadata[$k]->fieldMappings[$fieldName]['default'] = $column->getDefault();
                }
                break;
            }
        }
    }
}

// GENERATE PHP ENTITIES!
$entityGenerator = new \Doctrine\ORM\Tools\EntityGenerator();
$entityGenerator->setGenerateAnnotations(true);
$entityGenerator->setGenerateStubMethods(true);
$entityGenerator->setRegenerateEntityIfExists(true);
$entityGenerator->setUpdateEntityIfExists(false);
$entityGenerator->generate($metadata, __DIR__);

echo "Entities created";
Комментарии (2)

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

Используя события жизненного цикла `prePersist, можно установить значение по умолчанию на Вашем предприятие только на начальном сохраняются.

Комментарии (1)

Будьте внимательны при установке значений по умолчанию на определение свойства! Это делать не в конструкторе, чтобы сохранить его проблемы-бесплатно. Если вы определите это по определению свойство, затем сохранить объект в базу данных, а затем сделать частичные нагрузки, дальше не грузится свойства будет иметь значение по умолчанию. Это опасно, если вы хотите сохранить объект.

Комментарии (0)