web-dev-qa-db-fra.com

Comment fixer une date en Doctrine 2?

J'ai un champ nommé "anniversaire" dans l'entité doctrine.

Je voudrais créer un objet à ajouter à la base de données en utilisant la doctrine.

À l'intérieur du contrôleur:

$name = "John Alex";
$birthday = "11-11-90";
$student = new Student();
$student->setName($name);
$student->setBirthday(strtotime($birthday);
...

mais quand j'essaie de persister, j'obtiens cette erreur

Fatal error: Call to a member function format() on a non-object in /Library/WebServer/Documents/Symfony/vendor/doctrine-dbal/lib/Doctrine/DBAL/Types/DateType.php on line 44

Modifier:

Mon entité:

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var date $birthday
 *
 * @ORM\Column(name="birthday", type="date", nullable=true)
 */
private $birthday;

/**
 * Set birthday
 *
 * @param date $birthday
 */
public function setBirthday($birthday)
{
    $this->birthday = $birthday;
}

/**
 * Get birthday
 *
 * @return date 
 */
public function getBirthday()
{
    return $this->birthday;
}
27
Mohamed
$name = "John Alex";
$birthday = "11-11-1990"; // I changed this
$student = new Student();
$student->setName($name);
$student->setBirthday(new \DateTime($birthday)); // setting a new date instance
// ...
39
Mohamed

Les champs de vos entités mappés comme "datetime" ou "date" doit contenir des instances de DateTime .

Par conséquent, votre setter doit être indiqué comme suit:

/**
 * Set birthday
 *
 * @param \DateTime|null $birthday
 */
public function setBirthday(\DateTime $birthday = null)
{
    $this->birthday = $birthday ? clone $birthday : null;
}

/**
 * Get birthday
 *
 * @return \DateTime|null 
 */
public function getBirthday()
{
    return $this->birthday ? clone $this->birthday : null;
}

Cela permet de définir null ou une instance de DateTime pour l'anniversaire.

Comme vous le remarquez, j'ai également clone les valeurs de la date d'anniversaire pour éviter de casser l'encapsulation (voir Doctrine2 ORM n'enregistre pas les modifications apportées à un champ DateTime ).

Pour définir l'anniversaire, il vous suffit ensuite de faire ce qui suit:

$student->setBirthday(new \DateTime('11-11-90'));
27
Ocramius