web-dev-qa-db-fra.com

Doctrine 2.1 - valeur par défaut de la colonne datetime

Quelqu'un pourrait-il me dire comment ajouter une valeur par défaut à la colonne datetime? Je ne peux pas faire ça comme ça:

protected $registration_date = date("Y-m-d H:i:s", time());

Alors comment?

30
Krzysztof Trzos

Vous mappez votre propriété en tant que type DateTime, puis définissez la valeur dans le constructeur à l'aide d'une nouvelle instance DateTime:

/**
 * @Entity
 * @Table(name="...")
 */
class MyEntity
{
    /** @Column(type="datetime") */
    protected $registration_date;

    public function __construct()
    {
        $this->registration_date = new DateTime(); 
    }
}

Cela fonctionne comme le constructeur d'une classe persistante n'est pas appelé à l'hydratation.

35
Max

Vous pouvez également utiliser des rappels de cycle de vie si vous voulez être très précis:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\HasLifecycleCallbacks
 * ...
 */
class MyEntity
{
    /**
     * @ORM\PrePersist
     */
    public function onPrePersistSetRegistrationDate()
    {
        $this->registration_date = new \DateTime();
    }
}
51

Pour la valeur par défaut CURRENT_TIMESTAMP:

     @ORM\Column(name="created_at", type="datetime", options={"default": "CURRENT_TIMESTAMP"})

Ou pour les anciennes versions de Symfony:

     @ORM\Column(name="created_at", type="datetime", options={"default": 0})

Travaillé pour moi ... Cependant, ceci ne fonctionne qu'avec MySQL .

44
sanis

Il existe une extension pour cette automatisation de cette ...

https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/timestampable.md

/**
     * @var \DateTime
     *
     * @ORM\Column(name="date_added", type="datetime")
     * @Gedmo\Timestampable(on="create")
     */
    private $date_added;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_modified", type="datetime")
     * @Gedmo\Timestampable(on="update")
     */
    private $date_modified;
20
rat4m3n

Je pense que la meilleure façon de réaliser la saisie automatique pour datetime est de faire comme ça:

* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})

Mettre la logique dans constructeur n'est pas une bonne solution, car la définition des valeurs par défaut est responsabilité du client SQL . Si vous décidez de ne plus utiliser ORM, vous perdrez votre logique métier. De plus, si vous utilisez un constructeur, vous ne pourrez pas ajouter d’horodatage par défaut aux attributs datetime pour lignes existantes .

19
D.Samchuk
@var string @ORM\Column(name="login_at", type="datetime", options={"default" = "CURRENT_TIMESTAMP"})

Cela fonctionnera. Je poste juste pour la future réf.

3
nikhil_

Travaillez pour moi avec MySql et Symfony 3.4.

...
fields:
    start_date:
        type: date
        nullable: false
        options:
            default: '1910-01-01'
            comment: 'The default date is 1910-01-01'
...
0
sdespont