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 поле теперь будет преобразовано в целое число.

Смотрите также

С 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();
Другие вопросы по тегам