¿Cómo configuro un valor predeterminado en Doctrine 2?
php
orm
doctrine-orm
Jiew Meng
fuente
fuente
Respuestas:
Los valores predeterminados de la base de datos no son compatibles con "portabilidad". La única forma de usar los valores predeterminados de la base de datos es a través del
columnDefinition
atributo de mapeo donde especifica elSQL
fragmento (DEFAULT
causa inclusiva) para la columna a la que se asigna el campo.Puedes usar:
Se prefieren los valores predeterminados de nivel PHP, ya que también están disponibles correctamente en los objetos recién creados y persistentes (Doctrine no volverá a la base de datos después de persistir en un nuevo objeto para obtener los valores predeterminados).
fuente
Tenga en cuenta que esto usa SQL
DEFAULT
, que no es compatible con algunos campos comoBLOB
yTEXT
.fuente
options
parámetro también es útil para losunsigned
valores. ver esta respuestaoptions={"default": 0}
tenga cuidado de usar "y no", ya que causa errores en mi versión de la doctrina.Configure un constructor en su entidad y establezca el valor predeterminado allí.
fuente
Utilizar:
y no:
Por ejemplo:
fuente
Actualizar
Una razón más por la que leer la documentación de Symfony nunca pasará de moda. Hay una solución simple para mi caso específico y es configurar la
field type
opciónempty_data
en un valor predeterminado.Nuevamente, esta solución es solo para el escenario donde una entrada vacía en un formulario establece el campo DB en nulo.
Antecedentes
Ninguna de las respuestas anteriores me ayudó con mi escenario específico, pero encontré una solución.
Tenía un campo de formulario que debía comportarse de la siguiente manera:
Luego probé todas las recomendaciones dadas aquí. Déjame enumerarlos:
IMPORTANTE
Los campos de formulario de Symfony anulan los valores predeterminados establecidos en la clase Entity. Es decir, su esquema para su base de datos puede tener un valor predeterminado definido, pero si deja un campo no requerido vacío al enviar su formulario, el
form->handleRequest()
interior de suform->isValid()
método anulará esos valores predeterminados en suEntity
clase y los establecerá en los valores del campo de entrada. Si los valores del campo de entrada están en blanco, establecerá laEntity
propiedad ennull
.http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Mi solución
Establezca el valor predeterminado en su controlador después de
form->handleRequest()
dentro de suform->isValid()
método:No es una solución hermosa pero funciona. Probablemente podría hacer un
validation group
pero puede haber personas que vean este problema como una transformación de datos en lugar de una validación de datos , lo dejo a usted para decidir.Setter de anulación (no funciona)
También intenté anular el
Entity
setter de esta manera:Esto, a pesar de que se ve más limpio, no funciona . La razón es que el
form->handleRequest()
método malvado no usa los métodos de establecimiento del Modelo para actualizar los datos (profundiceform->setData()
para obtener más detalles).fuente
La solución que usé fue a
LifeCycleCallback
. Todavía estoy esperando ver si hay algún otro método "nativo", por ejemplo@Column(type="string", default="hello default value")
.fuente
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
También puedes hacerlo usando xml:
fuente
Así es como lo resolví por mí mismo. A continuación se muestra un ejemplo de entidad con valor predeterminado para MySQL. Sin embargo, esto también requiere la configuración de un constructor en su entidad, y para que establezca el valor predeterminado allí.
fuente
columnDefinition
va directamente contra el propósito de tener un ORM, que es la abstracción de la base de datos. Esta solución romperá la portabilidad, mantendrá su software dependiente de su proveedor de DB y también romperá las herramientas de Doctrine Migrations.Funciona para mí en una base de datos mysql también:
fuente
Nada de esto funcionó para mí. Encontré documentación en el sitio de doctrina que dice establecer el valor directamente para establecer un valor predeterminado.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
Esto insertó el valor que quería.
fuente
Agregando a @romanb una respuesta brillante.
Esto agrega un poco de sobrecarga en la migración, porque obviamente no puede crear un campo sin restricción nula y sin valor predeterminado.
Con esta respuesta, le animo a que piense, ¿por qué necesita el valor predeterminado en la base de datos en primer lugar? Y generalmente es para permitir crear objetos sin restricciones nulas.
fuente
Si usa la definición yaml para su entidad, lo siguiente funciona para mí en una base de datos postgresql:
fuente
$entity->setFieldName()
antes de enjuagar? Doctrine parece definir el valor predeterminado en nulo. La única solución en yaml es definir el valor predeterminado EN la clase de entidad que me parece tonto ya que ya está definido en el yaml ... -_-Luché con el mismo problema. Quería tener el valor predeterminado de la base de datos en las entidades (automáticamente). Adivina qué, lo hice :)
fuente
Si bien establecer el valor en el constructor funcionaría, usar los eventos de Doctrine Lifecycle podría ser una mejor solución.
Al aprovechar el
prePersist
Evento del ciclo de vida, puede establecer su valor predeterminado en su entidad solo en la persistencia inicial.fuente
hack
. Nunca confíes en hacks.¡Tenga cuidado al establecer valores predeterminados en la definición de propiedad! Hazlo en el constructor, para mantenerlo libre de problemas. Si lo define en la definición de propiedad, luego persiste el objeto en la base de datos, luego realiza una carga parcial, luego las propiedades no cargadas nuevamente tendrán el valor predeterminado. Eso es peligroso si desea persistir el objeto nuevamente.
fuente