Como defino um valor padrão no Doctrine 2?
php
orm
doctrine-orm
Jiew Meng
fonte
fonte
Respostas:
Os valores padrão do banco de dados não são "portably" suportados. A única maneira de usar os valores padrão do banco de dados é através do
columnDefinition
atributo de mapeamento no qual você especifica oSQL
snippet (DEFAULT
inclusive causa) para a coluna na qual o campo é mapeado.Você pode usar:
Os valores padrão no nível PHP são preferidos, pois eles também estão disponíveis adequadamente em objetos recém-criados e persistentes (o Doctrine não retornará ao banco de dados após persistir em um novo objeto para obter os valores padrão).
fonte
Observe que isso usa SQL
DEFAULT
, que não é suportado em alguns campos comoBLOB
eTEXT
.fonte
options
parâmetro também é útil paraunsigned
valores. veja esta respostaoptions={"default": 0}
Tenha o cuidado de utilização "e não', uma vez que provoca erros na minha versão da doutrina.Configure um construtor em sua entidade e defina o valor padrão lá.
fonte
Usar:
e não:
Por exemplo:
fonte
Atualizar
Mais um motivo para ler a documentação do Symfony nunca sair de moda. Existe uma solução simples para o meu caso específico e é definir a
field type
opçãoempty_data
para um valor padrão.Novamente, esta solução é apenas para o cenário em que uma entrada vazia em um formulário define o campo DB como nulo.
fundo
Nenhuma das respostas anteriores me ajudou com meu cenário específico, mas eu encontrei uma solução.
Eu tinha um campo de formulário que precisava se comportar da seguinte maneira:
Eu então tentei todas as recomendações dadas aqui. Deixe-me listá-los:
IMPORTANTE
Os campos do formulário do Symfony substituem os valores padrão definidos na classe Entity. Ou seja, seu esquema para seu banco de dados pode ter um valor padrão definido, mas se você deixar um campo não obrigatório vazio ao enviar seu formulário, o método
form->handleRequest()
internoform->isValid()
substituirá esses valores padrão em suaEntity
classe e os definirá para os valores do campo de entrada. Se os valores do campo de entrada estiverem em branco, aEntity
propriedade será configurada paranull
.http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Minha solução alternativa
Defina o valor padrão no seu controlador depois de
form->handleRequest()
dentro do seuform->isValid()
método:Não é uma solução bonita, mas funciona. Provavelmente eu poderia fazer um,
validation group
mas pode haver pessoas que veem esse problema como uma transformação de dados , e não como validação de dados , deixo para você decidir.Substituir setter (não funciona)
Eu também tentei substituir o
Entity
setter desta maneira:Embora pareça mais limpo, não funciona . A razão é que o
form->handleRequest()
método evil não usa os métodos setter do Model para atualizar os dados (procureform->setData()
mais detalhes).fonte
A solução alternativa que usei foi a
LifeCycleCallback
. Ainda estou esperando para ver se existe algum método "nativo", por exemplo@Column(type="string", default="hello default value")
.fonte
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
Você pode fazer isso usando xml também:
fonte
Aqui está como eu resolvi isso sozinho. Abaixo está um exemplo de entidade com valor padrão para MySQL. No entanto, isso também requer a configuração de um construtor em sua entidade e para você definir o valor padrão lá.
fonte
columnDefinition
vai diretamente contra o propósito de ter um ORM, que é uma abstração do banco de dados. Essa solução interromperá a portabilidade, manterá o software dependente do fornecedor do banco de dados e também interromperá as ferramentas de migração de doutrina.Funciona para mim em um banco de dados mysql também:
fonte
Nada disso funcionou para mim. Encontrei alguma documentação no site da doutrina que diz para definir o valor diretamente para definir um valor padrão.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
Isso inseriu o valor que eu queria.
fonte
Adicionando à resposta brilhante @romanb.
Isso adiciona um pouco de sobrecarga na migração, porque você obviamente não pode criar um campo sem restrição nula e sem valor padrão.
Com esta resposta, encorajo você a pensar por que você precisa do valor padrão no banco de dados em primeiro lugar? E geralmente é para permitir a criação de objetos sem restrição nula.
fonte
Se você usar a definição de yaml para sua entidade, o seguinte funcionará para mim em um banco de dados postgresql:
fonte
$entity->setFieldName()
antes da descarga? A doutrina parece definir o valor padrão em nulo. A única solução em yaml é definir o valor padrão IN a classe de entidade que parece mudo para mim, uma vez que já está definido no yaml ... -_-Eu lutei com o mesmo problema. Eu queria ter o valor padrão do banco de dados nas entidades (automaticamente). Adivinha o quê, eu fiz isso :)
fonte
Embora a definição do valor no construtor funcione, o uso dos eventos do Ciclo de Vida do Doctrine pode ser uma solução melhor.
Ao alavancar o
prePersist
Evento do Ciclo de Vida, você pode definir seu valor padrão em sua entidade apenas na persistência inicial.fonte
hack
. Nunca confie em hacks.Cuidado ao definir valores padrão na definição da propriedade! Faça-o no construtor, para mantê-lo livre de problemas. Se você defini-lo na definição da propriedade, persista o objeto no banco de dados, faça uma carga parcial e as propriedades não carregadas terão novamente o valor padrão. Isso é perigoso se você deseja persistir o objeto novamente.
fonte