如何将MySQL列“timestamp”映射到具有Doctrine2的字段

时间:2014-01-31 06:15:29

标签: php mysql symfony datetime doctrine-orm

我创建了一个Doctrine2实体,并希望将一个字段映射到MySQL中的timestamp列。

/**
 * @ORM\Table(name="biz_order")
 * @ORM\Entity(repositoryClass="Acme\OrderBundle\Repository\OrderRepository")
 */
class Order
{
    /**
     * @ORM\Column(name="order_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    // Lots of other fields ...

    /**
     * @ORM\Column(name="order_timestamp", type="datetime")
     */
    private $createdOn;    
}

如果注释类型为“datetime”,我会收到以下错误:

  

Doctrine \ DBAL \ Types \ ConversionException:无法将数据库值“1390362851”转换为Doctrine Type datetime。预期格式:Y-m-d H:i:s

     

at n / a           在/var/www/packer/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ConversionException.php第63行

     

在Doctrine \ DBAL \ Types \ ConversionException :: conversionFailedFormat('1390362851','datetime','Y-m-d H:i:s')           在/var/www/packer/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php第67行

然而在Doctrine 2.4 documentation我找到了

  

datetime:将SQL DATETIME / TIMESTAMP映射到PHP DateTime对象的类型。

如何将时间戳DB列映射到Doctrine2中的PHP类字段?

编辑: 到目前为止,我的解决方法是在ORM映射中使用type =“integer”并将其作为ValueObject

返回
public function getCreatedOn()
{
    $createdOn = new \DateTime();
    $createdOn->setTimestamp($this->createdOn);
    return $createdOn;
}

2 个答案:

答案 0 :(得分:2)

您只需创建自定义学说类型定义的时间戳see the documentation

即可

答案 1 :(得分:1)

您可以查看This post: datetime vs timestamp

由于它是createdAt属性,并且表示某个时间点,因此您可能希望获取在$createdAt之前或$createdAt之后创建的对象。

为此,您最好的选择是完全按照您的方式存储日期时间,但要将\Datetime对象与该字段相关联:$this->createdAt = new \Datetime();


最好的方法是使用lifecycle callbacks

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="biz_order")
 * @ORM\Entity(repositoryClass="Acme\OrderBundle\Repository\OrderRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Order
{
    /**
     * @ORM\Column(name="order_timestamp", type="datetime")
     */
    private $createdAt;    

    /**
     * @ORM\PrePersist
     */
    public function doStuffOnPrePersist()
    {
        $this->createdAt= new \DateTime();
    }


}