2017-06-06 116 views
1

我有以下Doctrine2实体:如何在Doctrine2 SELECT查询中处理DateTime类型的默认值?

<?php 

use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Timestampable\Traits\TimestampableEntity; 
/** 
* @ORM\Entity 
*/ 
class Account 
{ 
    use TimestampableEntity; 

    /** 
    * @var integer 
    * 
    * @ORM\Id 
    * @ORM\Column(type="integer", unique=true, nullable=false) 
    */ 
    private $id; 
} 

正如你可以看到我使用Gedmo Timestampable由包提供的Trait。它工作正常。

当我获取数据时,问题发生,并且列updated_at即将到来 NULL 0000-00-00 00:00:00。对于这样的情况下,DateTime对象被翻译成无效日期如下图所示:

‌array (
    'RowId' => 26944, 
    'synchflag' => 1, 
    'updatedAt' => 
    DateTime::__set_state(array(
    'date' => '-0001-11-30 00:00:00.000000', 
    'timezone_type' => 3, 
    'timezone' => 'UTC', 
)), 
) 

我没有检查docs但没有任何帮助的(或至少我没有发现它,如果你让我知道)

什么是正确的方式来处理这个?

编辑:

也许在这里正确的问题应该是:如果updated_at即将为0000-00-00 00:00:00我怎么把它变成NOW()?您可能会注意到getUpdatedAt()根据获取的数据返回DateTimeSELECT声明有任何事件吗?

+0

在我的实体updated_at设置等于created_at。没有面对这个问题 –

+0

你可以调试为什么你的updatedAt属性为空?创建实体触发器设置createdAt/updatedAt属性。 – miikes

回答

3

由于问题是,该数据库已经有那些无效的值,就可以从数据库中读取该无效值时,创建自己的学说日期时间类型进行转换为null:

<?php 
namespace AppBundle\Doctrine\DBAL; 

use DateTimeZone; 
use Doctrine\DBAL\Platforms\AbstractPlatform; 
use Doctrine\DBAL\Types\ConversionException; 
use Doctrine\DBAL\Types\DateTimeType; 

class MyDateTimeType extends DateTimeType 
{ 


    public function convertToPHPValue($value, AbstractPlatform $platform) 
    { 
     if (null === $value || $value instanceof \DateTime) { 
      return $value; 
     } 

     if ('0000-00-00 00:00:00' === $value) { 
      return null; 
     } 

     return parent::convertToPHPValue($value, $platform); 
    } 
} 

并注册该在教义配置自定义类型:

doctrine: 
    dbal: 
     types: 
      datetime: AppBundle\Doctrine\DBAL\MyDateTimeType 

注意:您可以使用正则表达式和/或日期时间有效性检查,而不是一个简单的比较,增强的代码