2017-06-06 113 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 

注意:您可以使用正則表達式和/或日期時間有效性檢查,而不是一個簡單的比較,增強的代碼