Cakephp-3.x:如何更改选定别名的数据类型?

Cakephp-3.x:如何更改选定别名的数据类型?,php,cakephp,casting,cakephp-3.0,query-builder,Php,Cakephp,Casting,Cakephp 3.0,Query Builder,当我尝试这样做时: $fields = array('id' => 'custom_id', 'title' => 'some_name'); 我得到的结果将id作为字符串 如果我这样做: $fields = array('custom_id', 'title' => 'some_name'); 然后它将自定义_id作为整数 如何在不丢失数据类型的情况下,以id的形式获取custom\u id。我阅读了文档,但没有找到多少帮助 我认为虚拟场可以做一些事情。但是,在find查

当我尝试这样做时:

$fields = array('id' => 'custom_id', 'title' => 'some_name');
我得到的结果将
id
作为字符串

如果我这样做:

$fields = array('custom_id', 'title' => 'some_name');
然后它将
自定义_id
作为整数

如何在不丢失数据类型的情况下,以
id
的形式获取
custom\u id
。我阅读了文档,但没有找到多少帮助

我认为虚拟场可以做一些事情。但是,在find查询中是否可以不使用虚拟字段等

提前感谢

从CakePHP 3.2开始 您可以使用
Query::selectTypeMap()
添加更多类型,这些类型仅用于在检索数据时强制转换所选字段

$query = $table
    ->find()
    ->select(['alias' => 'actual_field', /* ... */]);

$query
    ->selectTypeMap()
    ->addDefaults([
        'alias' => 'integer'
    ]);
您可以使用任何内置数据类型,也可以使用自定义数据类型。在这种情况下,
别名
字段现在将转换为整数

另见

使用CakePHP 3.1及更早版本 您必须使用
Query::typeMap()
,这不仅会在检索数据时影响所选字段,还会影响其他需要根据字段类型强制转换数据的地方,这可能会导致不必要的冲突,因此请谨慎使用

$query
    ->typeMap()
    ->addDefaults([
        'alias' => 'integer'
    ]);
另见

更改现有列的类型 也可以更改表中现有列的类型,但是需要使用特定语法进行设置,即CakePHP使用的列别名格式,即表别名和列名,由
\uuuuuuu
分隔,例如,对于具有
文章
别名和名为
id
的列的表,它将是
Articles\uu id

这可以手动设置,也可以通过
Query::aliasField()
检索,例如:

// $field will look like ['Alias__id' => 'Alias.id']
$field = $query->aliasField('id', $table->alias());

$query
    ->selectTypeMap()
    ->addDefaults([
        key($field) => 'string'
    ]);
这会将
id
列的默认类型更改为
string

另见


嗨,我的备选示例完整,用户模式()在控制器中用户按连接数据添加类型列别名:

        $this->Users->schema()
            ->addColumn('is_licensed', [
                'type' => 'boolean',
            ])
            ->addColumn('total_of_licenses', [
                'type' => 'integer',
            ]);

        $fields = [
            'Users.id',
            'Users.username',
            'Users.first_name',
            'Users.last_name',
            'Users.active',
            'Users__is_licensed' => 'if(count(LicenseesUsers.id)>=1,true,false)',
            'Users__total_of_licenses' => 'count(LicenseesUsers.id)',
            'Users.created',
            'Users.modified',
            'Languages.id',
            'Languages.name',
            'Countries.id',
            'Countries.name',
            'UserRoles.id',
            'UserRoles.name',
        ];

     $where = [
        'contain' => ['UserRoles', 'Countries', 'Languages'],
        'fields' => $fields,
        'join' => [
            'LicenseesUsers' => [
                'table' => 'licensees_users',
                'type' => 'LEFT',
                'conditions' => [
                    'Users.id = LicenseesUsers.users_id'
                ],
            ],
        ],
        'group' => 'Users.id'
    ];

    // Set pagination
    $this->paginate = $where;

   // Get data in array
   $users = $this->paginate($this->Users)->toArray();

我使用的是cake 3.0.6,当使用第二个解决方案时,它会显示对未定义方法cake\Database\TypeMap::addDefaults()的调用。我使用了
TypeMap.php
TypeMapTrait.php
中的其他函数,但没有任何运气。然后更新您的CakePHP依赖项。上一个3.0.x版本是3.0.16@AshishChoudharyStill也一样。我的
defaultTypes
具有
'id'=>'integer'
,但输出仍然是字符串。我已经用CakePHP3.1.5尝试过了<代码>'defaultTypes'=>['id'=>'integer']请您发布一个工作示例。我将复制粘贴原样代码并更改模型,以查看这是否也适用于我。我能看到的是代码看起来很好。函数也有意义,但输出不变。上面的代码片段是一个“工作示例”,它工作正常,
alias
将作为整数返回。如果你在你的环境中对此有问题,那么你必须拿出一个可复制的例子@阿什霍德哈里酒店