【问题标题】:Override Cakephp 3.1 data type using typeMap()使用 typeMap() 覆盖 Cakephp 3.1 数据类型
【发布时间】:2016-04-28 06:51:24
【问题描述】:

当我有疑问时:

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

乍一看,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 是一个复杂的左内连接子查询,我从这个问题中取出了它以保持简单。

【问题讨论】:

    标签: php cakephp casting query-builder cakephp-3.1


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多