2016-04-28 71 views
0

當我有一個查詢CakePHP的3.1數據類型:覆蓋使用類型映射()

$jobs = $this->Jobs->find('all', [ 
    'fields' => [ 
     'id', 
     'existingdatetime', 
     'newdatetime' => '"2016-05-10 16:12:10"', 
    ], 
]); 

的existingdatetime返回爲一個DateTime對象,而newdatetime被作爲字符串返回,這是有意義的,因爲沒有數據定義爲不存在的字段newdatetime。基於Cakephp-3.x: How to change the data type of a selected alias?我試過如下:

debug($jobs->typeMap()); 
$jobs->typeMap()->addDefaults([ 
    'Jobs.newdatetime' => 'datetime', 
    'newdatetime' => 'datetime', 
]); 
debug($jobs->typeMap()); 
$results = $jobs->all(); 
debug($results); 

起初看來類型映射已經成功更新,這裏的舊版本:

/src/Controller/Admin/JobsController.php(線97)

object(Cake\Database\TypeMap) { 
    [protected] _defaults => [ 
     'Jobs.id' => 'integer', 
     'id' => 'integer', 
     'Jobs.existingdatetime' => 'datetime', 
     'existingdatetime' => 'datetime' 
    ] 
    [protected] _types => [] 
} 

而且新版本調用addDefaults()看來該數據類型更新罰款的結果...

/src目錄/對照奧勒/管理/ JobsController.php(線102)

object(Cake\Database\TypeMap) { 
    [protected] _defaults => [ 
     'Jobs.id' => 'integer', 
     'id' => 'integer', 
     'Jobs.existingdatetime' => 'datetime', 
     'existingdatetime' => 'datetime', 
     'Jobs.newdatetime' => 'datetime' 
     'newdatetime' => 'datetime', 
    ] 
    [protected] _types => [] 
} 

然而結果仍具有newdatetime作爲字符串:

/src/Controller/Admin/JobsController.php(線106)

object(Cake\ORM\ResultSet) { 
    'query' => object(Cake\ORM\Query) { 
     '(help)' => 'This is a Query object, to get the results execute or iterate it.', 
     'sql' => 'SELECT Jobs.id AS `Jobs__id`, Jobs.existingdatetime AS `Jobs__existingdatetime`, "2016-05-10 16:12:10" AS `newdatetime` FROM jobs Jobs', 
     'params' => [], 
     'defaultTypes' => [ 
      'Jobs.id' => 'integer', 
      'id' => 'integer', 
      'Jobs.existingdatetime' => 'datetime', 
      'existingdatetime' => 'datetime', 
      'Jobs.newdatetime' => 'datetime' 
      'newdatetime' => 'datetime', 
     ], 
     'decorators' => (int) 0, 
     ...snip... 
    } 
    'items' => [ 
     (int) 0 => object(App\Model\Entity\Job) { 
      'id' => (int) 1, 
      'existingdatetime' => object(Cake\I18n\Time) { 
       'time' => '2016-04-27T03:21:32+1000', 
       'timezone' => 'Australia/Melbourne', 
       'fixedNowTime' => false 
      }, 
      'newdatetime' => '2016-05-10 16:12:10', 
      '[new]' => false, 
      '[accessible]' => [ 
       '*' => true 
      ], 
      '[dirty]' => [], 
      '[original]' => [], 
      '[virtual]' => [], 
      '[errors]' => [], 
      '[repository]' => 'Jobs' 
     } 
    ] 
} 

我錯過了什麼?爲什麼我不能讓我的額外領域成爲一個日期時間?

請不要提出完全不同的方法,實際上,newdatetime是一個複雜的左連接子查詢,我已經從這個問題中解決了這個問題,以保持簡單。

回答

1

它不使用類型映射功能,但它的自定義字段轉換成你需要

$jobs = $this->Jobs->find() 
->select([ 'id', 'existingdatetime', 'newdatetime' => '"2016-05-10 16:12:10"' ]) 
->decorateResults(function ($row) { 
    $row['newdatetime'] = new \Cake\I18n\Time($row['newdatetime']); 
    return $row; 
}); 

DateTime類型你可以在這裏看到關於它的更多:CakePHP 3 Decorate Results