2

ZF2 と Doctrine-Module で Doctrine 2 を使用しています。Doctrine は主キーで Date|Datetime を許可しないため、PreUpdate|PrePersist が必要なエンティティを作成しました。

<?php

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 *
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="sample")
 */
class Sample
{

    /**
     *
     * @ORM\Id
     * @ORM\Column(type="string")
     * @var integer
     */
    protected $runmode;

    /**
     *
     * @ORM\Id
     * @ORM\Column(type="date")
     * @var DateTime
     */
    protected $date;


    public function getRunmode()
    {
        return $this->runmode;
    }

    public function setRunmode($runmode)
    {
        $this->runmode = $runmode;
        return $this;
    }

    public function getDate()
    {
        return $this->date;
    }

    public function setDate($date)
    {
        $this->date = $date;
        return $this;
    }

    /**
     *
     * @ORM\PreUpdate
     * @ORM\PrePersist
     */
    protected function formatDate()
    {
        die('preUpdate, prePersist');
        if ($this->date instanceof \DateTime) {
            $this->date = $this->date->format('Y-m-d');
        }
        return $this;
    }

}

問題は、DateTime を Date として設定すると、次のメッセージが表示されることです。

"Object of class DateTime could not be converted to string"

formatDate に入らないためです。

4

1 に答える 1

5

まず、フィールドSample#dateを としてマップしたためdatetime、常にnullまたは のインスタンスである必要がありますDateTime

したがって、setDate次のようにメソッドをタイプヒントする必要があります。

public function setDate(\DateTime $date = null)
{
    $this->date = $date;
    return $this;
}

また、メソッドの可視性が であるため、ライフサイクル コールバックは呼び出されず、ORM からアクセスできません。に変更すると動作します。とにかく変換​​は必要ないはずなので、それを取り除くことができます。formatDateprotectedpublic

于 2013-02-25T12:06:05.327 に答える