web-dev-qa-db-ja.com

Doctrine 2?

doctrineエンティティに「誕生日」という名前のフィールドがあります。

Doctrineを使用してデータベースに追加するオブジェクトを作成したいと思います。

コントローラー内部:

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

しかし、持続しようとすると、このエラーが発生します

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

編集:

私のエンティティ:

/**
 * @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

"datetime"または"date"としてマップされたエンティティのフィールドには、 DateTime のインスタンスが含まれている必要があります。

したがって、セッターは次のようにタイプヒントを使用する必要があります。

/**
 * 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;
}

これにより、誕生日にnullまたはDateTimeのインスタンスを設定できます。

お気づきのように、カプセル化が破られるのを避けるため、誕生日の値もcloneします( Doctrine2 ORMはDateTimeフィールドへの変更を保存しない を参照)。

誕生日を設定するには、次の手順を実行します。

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