2016-04-28 18 views
0

を使用して入力します存在しないフィールドnewdatetimeのデータ定義。 Cakephp-3.x: How to change the data type of a selected alias?に基づいて、私は次のことを試してみました:オーバーライドcakephpの3.1データは、私は、クエリを持っている場合にタイプマップ()

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

最初はそれがたTypeMapが正常に更新されたことが表示され、ここでは古いバージョンです:

/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/CONTR oller /管理/ 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

それはされたTypeMap機能を使用していませんが、それはあなたがここでそれについての詳細を見ることができますが、

$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; 
}); 

を必要と日時タイプにカスタムフィールドを変換します:CakePHP 3 Decorate Results