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


Cakephp-3.x: How to change the data type of a selected alias?

>我尝试做:

$fields = array('id' => 'custom_id', 'title' => 'some_name');

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

如果我这样做:

$fields = array('custom_id', 'title' => 'some_name');

然后它给出custom_id为整数。

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

我认为虚拟领域可以做一些事情。但是是否可以在不使用虚拟字段等的情况下在查找查询中运行?

提前致谢

截至 CakePHP 3.2

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

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

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

参见

  • API> ''Cake''Database''Query::selectTypeMap()
  • Cookbook> Database Access & ORM> Database Basics> Data
  • Type
  • Cookbook> Database Access & ORM> Database Basics> Add Custom
  • Type

使用 CakePHP 3.1 及更早版本

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

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

参见

  • API> ''Cake''Database''Query::typeMap()

更改现有列的类型

更改表的现有列的类型也是可能的,但是它们需要使用特定的语法进行设置,即以 CakePHP 使用的列别名格式,即表别名和列名由 __ 分隔,例如,对于具有Articles别名和名为 id 的列的表, 这将是Articles__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

参见

  • API> ''Cake''Datasource''QueryInterface::aliasField()
嗨,

我的替代示例完整,控制器中的用户模式() 用户通过连接数据添加类型列别名Fiels:

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