当我尝试做的时候:
$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 Types
- Cookbook > Database Access & ORM > Database Basics > Adding Custom Types
使用 CakePHP 3.1 及更早版本
你必须使用Query::typeMap()
,这不仅会在检索数据时影响所选字段,而且还会影响其他需要根据需要转换数据的地方字段类型,这可能会导致不必要的冲突,因此请谨慎使用。
$query
->typeMap()
->addDefaults([
'alias' => 'integer'
]);
另见
更改现有列的类型
也可以更改表的现有列的类型,但是需要使用特定的语法来设置它们,即在 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
。
另见
关于php - Cakephp-3.x : How to change the data type of a selected alias?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35650306/