首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cakephp-3.x:如何更改选定别名的数据类型?

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

Stack Overflow用户
提问于 2016-02-26 19:16:53
回答 2查看 5.4K关注 0票数 2

WHen我尝试这样做:

代码语言:javascript
复制
$fields = array('id' => 'custom_id', 'title' => 'some_name');

我得到的结果是id作为字符串。

如果我这样做了:

代码语言:javascript
复制
$fields = array('custom_id', 'title' => 'some_name');

然后,它将custom_id表示为整数。

如何在不丢失数据类型的情况下获得id形式的custom_id。我阅读了文档,但没有找到太多帮助。

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

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2016-02-26 20:48:34

从CakePHP 3.2开始

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

代码语言:javascript
复制
$query = $table
    ->find()
    ->select(['alias' => 'actual_field', /* ... */]);

$query
    ->selectTypeMap()
    ->addDefaults([
        'alias' => 'integer'
    ]);

您可以使用任何内置数据类型,也可以使用自定义数据类型。在这种情况下,alias字段现在将转换为整数。

另请参阅

使用CakePHP 3.1和更早版本

您必须使用Query::typeMap(),这不仅会在检索数据时影响选定的字段,而且还会影响需要根据字段类型强制转换数据的各种其他位置,这可能会导致不必要的冲突,因此请谨慎使用。

代码语言:javascript
复制
$query
    ->typeMap()
    ->addDefaults([
        'alias' => 'integer'
    ]);

另请参阅

更改现有列的类型

也可以更改表的现有列的类型,但是需要使用特定的语法来设置它们,即使用CakePHP使用的列别名格式,即由__分隔的表别名和列名,例如,对于具有Articles别名和名为id的列的表,它将是Articles__id

这可以手动设置,或者更好地通过Query::aliasField()检索,例如:

代码语言:javascript
复制
// $field will look like ['Alias__id' => 'Alias.id']
$field = $query->aliasField('id', $table->alias());

$query
    ->selectTypeMap()
    ->addDefaults([
        key($field) => 'string'
    ]);

这会将id列的默认类型更改为string

另请参阅

票数 6
EN

Stack Overflow用户

发布于 2017-10-09 09:04:03

在我的替代示例full中,控制器Users中的user schema()添加类型列aliasFiels by join data:

代码语言:javascript
复制
        $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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35650306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档