0

クエリがある場合:

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

existingdatetime は DateTime オブジェクトとして返されますが、newdatetime は文字列として返されます。これは、存在しないフィールド newdatetime のデータ定義がないため意味があります。Cakephp-3.xに基づく: 選択したエイリアスのデータ型を変更するには? 私は次のことを試しました:

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/Controller/Admin/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 は複雑な左内部結合サブクエリであり、物事を単純にするためにこの質問から取り出しました。

4

1 に答える 1