>我尝试做:
$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();