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

时间:2016-02-26 11:16:53

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

我试着这样做:

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

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

如果我这样做:

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

然后它将custom_id作为整数。

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

我认为虚拟领域可以做些什么。但是在查询查询中是否可以不使用虚拟字段等?

先谢谢

2 个答案:

答案 0 :(得分:6)

从CakePHP 3.2开始

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

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

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

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

另见

使用CakePHP 3.1及更早版本

你将不得不使用Query::typeMap(),它不仅会在检索数据时影响所选字段,而且还会在其他各种地方根据字段类型进行数据转换,这可能会导致不必要的碰撞,所以要小心使用。

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

另见

更改现有列的类型

也可以更改表的现有列的​​类型,但是需要使用特定语法设置它们,即使用CakePHP使用的列别名格式,即表别名和列名由seprated by __,例如,对于包含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

另见

答案 1 :(得分:0)

我的替代示例完整,控制器中的用户架构()用户通过联接数据添加类型列aliasFiels:

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