Как установить значение по умолчанию в Doctrine 2?
php
orm
doctrine-orm
Jiew Meng
источник
источник
Ответы:
Значения по умолчанию для базы данных не поддерживаются. Единственный способ использовать значения по умолчанию для базы данных - использовать
columnDefinition
атрибут сопоставления, в котором вы указываетеSQL
фрагмент (DEFAULT
включающий причину) для столбца, в который отображается поле.Ты можешь использовать:
Значения по умолчанию на уровне PHP предпочтительнее, поскольку они также правильно доступны для вновь создаваемых и сохраняемых объектов (Doctrine не вернется в базу данных после сохранения нового объекта для получения значений по умолчанию).
источник
Обратите внимание, что здесь используется SQL
DEFAULT
, который не поддерживается для некоторых полей, таких какBLOB
иTEXT
.источник
options
параметр также полезен дляunsigned
значений. см. этот ответoptions={"default": 0}
будьте осторожны, используя «а не», так как это вызывает ошибки в моей версии доктрины.Установите конструктор в вашей сущности и установите там значение по умолчанию.
источник
Использование:
и нет:
Например:
источник
Обновить
Еще одна причина, почему чтение документации для Symfony никогда не выйдет из моды. Существует простое решение для моего конкретного случая и установить
field type
параметрempty_data
в значение по умолчанию.Опять же, это решение предназначено только для сценария, в котором пустой ввод в форме устанавливает для поля БД значение null.
Задний план
Ни один из предыдущих ответов не помог мне с моим конкретным сценарием, но я нашел решение.
У меня было поле формы, которое должно было вести себя следующим образом:
Затем я попробовал все рекомендации, приведенные здесь. Позвольте мне перечислить их:
ВАЖНЫЙ
Поля формы Symfony переопределяют значения по умолчанию, заданные в классе Entity. Это означает, что в вашей схеме для вашей БД может быть определено значение по умолчанию, но если вы оставите необязательное поле пустым при отправке формы,
form->handleRequest()
внутри вашегоform->isValid()
метода будет переопределен этот стандарт по умолчанию в вашемEntity
классе и задан для значений поля ввода. Если значения поля ввода не заполнены, тогда дляEntity
свойства будет установлено значениеnull
.http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Мой обходной путь
Установите значение по умолчанию на вашем контроллере после
form->handleRequest()
внутри вашегоform->isValid()
метода:Не красивое решение, но оно работает. Я мог бы сделать,
validation group
но могут быть люди, которые рассматривают эту проблему как преобразование данных, а не проверку данных , я оставляю вам решать.Переопределить сеттер (не работает)
Я также попытался переопределить
Entity
сеттер следующим образом:Это, хотя это выглядит чище, но не работает . Причина в том, что злой
form->handleRequest()
метод не использует методы установки Модели для обновления данных (изучитеform->setData()
более подробно).источник
Обходной путь, который я использовал, был
LifeCycleCallback
. Все еще жду, чтобы увидеть, например, есть ли еще «родной» метод@Column(type="string", default="hello default value")
.источник
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
Вы можете сделать это, используя xml:
источник
Вот как я решил это для себя. Ниже приведен пример Entity со значением по умолчанию для MySQL. Тем не менее, это также требует настройки конструктора в вашей сущности, и для вас, чтобы установить значение по умолчанию там.
источник
columnDefinition
идет прямо против цели наличия ORM, который является абстракцией от базы данных. Это решение нарушит мобильность, сохранит зависимость вашего программного обеспечения от поставщика БД, а также сломает инструменты Doctrine Migrations.У меня работает и в базе данных mysql:
источник
Ничто из этого не сработало для меня. Я нашел некоторую документацию на сайте доктрины, в которой говорится, чтобы установить значение напрямую, чтобы установить значение по умолчанию.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
Это вставило значение, которое я хотел.
источник
Добавление в @romanb блестящий ответ.
Это добавляет немного накладных расходов при миграции, потому что вы, очевидно, не можете создать поле с ненулевым ограничением и без значения по умолчанию.
С этим ответом я призываю вас задуматься, зачем вам сначала значение по умолчанию в базе данных? И обычно это позволяет создавать объекты с ненулевым ограничением.
источник
Если вы используете определение yaml для своей сущности, для меня работает следующее в базе данных postgresql:
источник
$entity->setFieldName()
перед промывкой? Doctrine, похоже, определяет значение по умолчанию в null. Единственное решение в yaml - определить значение по умолчанию В классе сущностей, которое мне кажется глупым, поскольку оно уже определено в yaml ... -_-Я боролся с той же проблемой. Я хотел получить значение по умолчанию из базы данных в сущности (автоматически). Угадай что, я сделал это :)
источник
Хотя установка значения в конструкторе будет работать, лучше использовать события жизненного цикла Doctrine.
Используя
prePersist
событие жизненного цикла, вы можете установить значение по умолчанию для вашей сущности только при первоначальном сохранении.источник
hack
. Никогда не полагайтесь на хаки.Будьте осторожны при установке значений по умолчанию при определении свойства! Вместо этого сделайте это в конструкторе, чтобы сохранить его без проблем. Если вы определите его в определении свойства, затем сохраните объект в базе данных, затем выполните частичную загрузку, тогда незагруженные свойства снова будут иметь значение по умолчанию. Это опасно, если вы хотите сохранить объект снова.
источник