Comment définir une valeur par défaut dans Doctrine 2?
php
orm
doctrine-orm
Jiew Meng
la source
la source
Réponses:
Les valeurs par défaut de la base de données ne sont pas "portables" prises en charge. La seule façon d'utiliser les valeurs par défaut de la base de données consiste à utiliser l'
columnDefinition
attribut de mappage dans lequel vous spécifiez l'SQL
extrait de code (DEFAULT
cause incluse) pour la colonne à laquelle le champ est mappé.Vous pouvez utiliser:
Les valeurs par défaut au niveau PHP sont préférées car elles sont également correctement disponibles sur les objets nouvellement créés et persistants (Doctrine ne reviendra pas à la base de données après avoir persisté un nouvel objet pour obtenir les valeurs par défaut).
la source
Notez que cela utilise SQL
DEFAULT
, qui n'est pas pris en charge pour certains champs commeBLOB
etTEXT
.la source
options
paramètre est également utile pour lesunsigned
valeurs. voir cette réponseoptions={"default": 0}
attention à utiliser "et non", car cela provoque des erreurs dans ma version de la doctrine.Configurez un constructeur dans votre entité et définissez-y la valeur par défaut.
la source
Utilisation:
et pas:
Par exemple:
la source
Mettre à jour
Une raison de plus pour laquelle la lecture de la documentation de Symfony ne sortira jamais de la tendance. Il existe une solution simple pour mon cas spécifique et consiste à définir l'
field type
optionempty_data
sur une valeur par défaut.Encore une fois, cette solution est uniquement pour le scénario où une entrée vide dans un formulaire définit le champ DB sur null.
Contexte
Aucune des réponses précédentes ne m'a aidé avec mon scénario spécifique mais j'ai trouvé une solution.
J'avais un champ de formulaire qui devait se comporter comme suit:
J'ai ensuite essayé toutes les recommandations données ici. Permettez-moi de les énumérer:
IMPORTANT
Les champs de formulaire Symfony remplacent les valeurs par défaut définies sur la classe Entity. Cela signifie que votre schéma pour votre base de données peut avoir une valeur par défaut définie, mais si vous laissez un champ non obligatoire vide lors de la soumission de votre formulaire, l'
form->handleRequest()
intérieur de votreform->isValid()
méthode remplacera ces valeurs par défaut sur votreEntity
classe et les définira sur les valeurs du champ d'entrée. Si les valeurs du champ de saisie sont vides, il définira laEntity
propriété surnull
.http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Ma solution
Définissez la valeur par défaut sur votre contrôleur après l'
form->handleRequest()
intérieur de votreform->isValid()
méthode:Pas une belle solution mais ça marche. Je pourrais probablement faire un
validation group
mais il peut y avoir des gens qui voient ce problème comme une transformation de données plutôt que la validation de données , je vous laisse le soin de décider.Remplacer le poseur (ne fonctionne pas)
J'ai également essayé de remplacer le
Entity
setter de cette façon:Cela, même s'il semble plus propre, cela ne fonctionne pas . La raison étant que la mauvaise
form->handleRequest()
méthode n'utilise pas les méthodes de définition du modèle pour mettre à jour les données (fouillezform->setData()
pour plus de détails).la source
La solution de contournement que j'ai utilisée était a
LifeCycleCallback
. J'attends toujours de voir s'il y a plus de méthode "native", par exemple@Column(type="string", default="hello default value")
.la source
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
Vous pouvez également le faire en utilisant xml:
la source
Voici comment je l'ai résolu par moi-même. Voici un exemple d'entité avec une valeur par défaut pour MySQL. Cependant, cela nécessite également la configuration d'un constructeur dans votre entité et pour que vous puissiez y définir la valeur par défaut.
la source
columnDefinition
va directement contre le but d'avoir un ORM, qui est l'abstraction de la base de données. Cette solution rompra la portabilité, gardera votre logiciel dépendant de votre fournisseur de base de données et cassera également les outils de Doctrine Migrations.Fonctionne pour moi sur une base de données mysql également:
la source
Rien de tout cela n'a fonctionné pour moi. J'ai trouvé de la documentation sur le site de doctrine qui dit de définir la valeur directement pour définir une valeur par défaut.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
Cela a inséré la valeur que je voulais.
la source
Ajout à @romanb brillante réponse.
Cela ajoute un peu de surcharge dans la migration, car vous ne pouvez évidemment pas créer un champ sans contrainte nulle et sans valeur par défaut.
Avec cette réponse, je vous encourage à penser pourquoi avez-vous besoin de la valeur par défaut dans la base de données en premier lieu? Et généralement, cela permet de créer des objets avec une contrainte non nulle.
la source
Si vous utilisez la définition yaml pour votre entité, ce qui suit fonctionne pour moi sur une base de données postgresql:
la source
$entity->setFieldName()
avant de rincer? La doctrine semble définir la valeur par défaut à null. La seule solution dans yaml est de définir la valeur par défaut IN dans la classe d'entité qui me semble idiote puisqu'elle est déjà définie dans le yaml ... -_-J'ai lutté avec le même problème. Je voulais avoir la valeur par défaut de la base de données dans les entités (automatiquement). Devinez quoi, je l'ai fait :)
la source
Bien que la définition de la valeur dans le constructeur fonctionne, l'utilisation des événements Doctrine Lifecycle pourrait être une meilleure solution.
En tirant parti de l'
prePersist
événement Cycle de vie, vous pouvez définir votre valeur par défaut sur votre entité uniquement lors de la persistance initiale.la source
hack
. Ne comptez jamais sur les hacks.Soyez prudent lorsque vous définissez des valeurs par défaut sur la définition de propriété! Faites-le dans le constructeur à la place, pour le garder sans problème. Si vous le définissez lors de la définition de la propriété, puis conservez l'objet dans la base de données, puis effectuez un chargement partiel, les propriétés non chargées auront à nouveau la valeur par défaut. C'est dangereux si vous voulez à nouveau persister l'objet.
la source