Cakephp-3.x: Как изменить тип данных выбранного псевдонима?
Когда я пытаюсь сделать:
$fields = array('id' => 'custom_id', 'title' => 'some_name');
В результате я получаю id
как строка
Если я сделаю:
$fields = array('custom_id', 'title' => 'some_name');
тогда это дает custom_id
как целое число
Как я могу получить custom_id
как id
без потери типа данных. Я прочитал документацию, но не нашел большой помощи.
Я думаю, что виртуальные поля могут что-то сделать. Но возможно ли это в поисковом запросе без использования виртуальных полей и т. Д.?
Заранее спасибо
2 ответа
Начиная с CakePHP 3.2
ты можешь использовать Query::selectTypeMap()
добавить дополнительные типы, которые будут использоваться только для приведения выбранных полей при получении данных.
$query = $table
->find()
->select(['alias' => 'actual_field', /* ... */]);
$query
->selectTypeMap()
->addDefaults([
'alias' => 'integer'
]);
Вы можете использовать любой из встроенных типов данных, а также пользовательских. В этом случае alias
поле теперь будет преобразовано в целое число.
Смотрите также
- API > \Cake\Database\Query::selectTypeMap()
- Поваренная книга> Доступ к базе данных и ORM > Основы базы данных> Типы данных
- Кулинарная книга> Доступ к базе данных и ORM > Основы работы с базами данных> Добавление пользовательских типов
С 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
,
Смотрите также
Привет мой альтернативный пример полный, пользовательская схема () в контроллере Пользователи добавляют тип столбца 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();