Comment puis-je définir une valeur par défaut dans Doctrine 2 ?
Bien vu ! Il semble qu'il n'y ait pas d'option options={"default" = 0} dans la documentation officielle.
Comment puis-je définir une valeur par défaut dans Doctrine 2 ?
Bien vu ! Il semble qu'il n'y ait pas d'option options={"default" = 0} dans la documentation officielle.
Très bien ! C'est très utile en outre d'avoir des valeurs par défaut en PHP (selon la réponse acceptée) lorsque vous migrez entre des versions de modèles et que vous ne voulez pas que des entités préexistantes obtiennent une valeur nulle pour un champ nouvellement ajouté !
Les valeurs par défaut des bases de données ne sont pas "portables". La seule façon d'utiliser les valeurs par défaut des bases de données est de passer par la fonction columnDefinition
où vous spécifiez l'attribut de mappage SQL
extrait ( DEFAULT
inclusivement) pour la colonne à laquelle le champ est associé.
Vous pouvez utiliser :
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
Les valeurs par défaut au niveau PHP sont préférables car elles sont également disponibles sur les objets nouvellement créés et persistés (Doctrine ne retournera pas à la base de données après avoir persisté un nouvel objet pour obtenir les valeurs par défaut).
Il faut être prudent avec les migrations utilisant cette approche, car toute rangée existante fera échouer la migration.
Cela semble être l'approche logique. Quelqu'un a-t-il rencontré des problèmes avec la mise en place de valeurs par défaut dans le constructeur ?
La solution recommandée par Doctrine : doctrine-project.org/docs/orm/2.1/en/reference/faq.html
Je suis désolé, vous avez raison. Vous pouvez donc trouver une explication sur cette page : doctrine-formulaire annotations-référence
Une raison de plus pour laquelle lire la documentation pour Symfony ne sera jamais démodée. Il y a une solution simple pour mon cas spécifique et c'est de mettre le paramètre field type
option empty_data
à une valeur par défaut.
Encore une fois, cette solution ne concerne que le scénario dans lequel une entrée vide dans un formulaire donne la valeur null au champ de la base de données.
Aucune des réponses précédentes ne m'a aidé dans 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 :
Définit une valeur par défaut pour la propriété de l'entité :
<?php /**
Utilisez l'annotation "options" :
@ORM\Column(name="foo", options={"default":"foo bar"})
Définit la valeur par défaut sur le constructeur :
/**
Rien de tout cela n'a fonctionné et tout cela à cause de la façon dont Symfony utilise votre classe Entity.
Les champs de formulaire Symfony remplacent les valeurs par défaut définies dans la classe Entity. En d'autres termes, le schéma de votre base de données peut définir une valeur par défaut, mais si vous laissez un champ non obligatoire vide lors de l'envoi de votre formulaire, le système de gestion de l'information de la base de données de l'Union européenne (UE) sera activé. form->handleRequest()
à l'intérieur de votre form->isValid()
remplacera ces valeurs par défaut dans votre Entity
et de les définir comme les valeurs des champs de saisie. Si les valeurs du champ de saisie sont vides, la classe Entity
à la propriété null
.
http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Définissez la valeur par défaut sur votre contrôleur après form->handleRequest()
à l'intérieur de votre form->isValid()
méthode :
...
if ($myEntity->getMyColumn() === null) {
$myEntity->setMyColumn('myDefaultValue');
}
...
Ce n'est pas une belle solution mais elle fonctionne. Je pourrais probablement faire un validation group
mais il y a peut-être des gens qui voient cette question comme une transformation de données plutôt que validation des données Je vous laisse le soin de décider.
J'ai également essayé de remplacer le Entity
de cette façon :
...
/**
* Set myColumn
*
* @param string $myColumn
*
* @return myEntity
*/
public function setMyColumn($myColumn)
{
$this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;
return $this;
}
...
Ceci, même si ça a l'air plus propre, ça ne marche pas . La raison étant que le mal form->handleRequest()
n'utilise pas les méthodes setter du modèle pour mettre à jour les données (voir la section form->setData()
pour plus de détails).
Cette réponse devrait figurer en tête de liste, c'est certain. Le composant de formulaire utilise PropertyAccessor pour obtenir et définir les valeurs de vos propriétés. Peut-être que l'accesseur de propriété devrait utiliser les méthodes lorsqu'elles sont disponibles ?
Les colonnes booléennes ne supportent pas les valeurs par défaut de php, donc seulement les annotations.
C'est la seule solution qui fonctionne lorsque les informations proviennent de formulaires. Je ne suis pas non plus d'accord avec les commentaires ci-dessus concernant les booléens. Ils n'acceptent pas l'annotation par défaut.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
27 votes
@ORM \Column (name="foo", type="decimal", precision=7, scale=2, options={"default" = 0}) fonctionne (à partir de la réponse non populaire ci-dessous)
4 votes
@ORM \Column (name="is_activated", type="boolean",options={"default":0}) OR @ORM \Column (name="is_activated", type="boolean",options={"default"= 0})
0 votes
Ahmed, cela ne semble pas fonctionner pour les booléens dans Symfony 2.3. Cependant, options={"default" = "0"}) fonctionne, en mettant le nombre entier entre guillemets.
4 votes
Si c'est un booléen, pourquoi n'utilisez-vous pas : options={"default":false} ?