2

我将 Doctrine 2 与 ZF2 和 Doctrine-Module 一起使用。我编写了一个需要 PreUpdate|PrePersist 的实体,因为 Doctrine 不允许 Date|Datetime 在主键中:

<?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#datedatetime,因此它应该始终nullDateTime.

因此,您应该setDate按以下方式输入您的方法:

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

此外,您的生命周期回调不会被调用,因为方法的可见性formatDateprotected,因此 ORM 无法访问。将其更改为public,它将起作用。无论如何都不需要转换,因此您可以摆脱它。

于 2013-02-25T12:06:05.327 回答