Cakephp-3.x: ¿Cómo cambiar el tipo de datos de un alias seleccionado?

Cuando trato de hacer:

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

El resultado que obtengo tiene id como cadena.

Si lo hago:

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

luego da custom_id como entero.

¿Cómo puedo obtener custom_id como id sin perder el tipo de datos? Leí la documentación pero no encontré mucha ayuda.

Creo que hay algo que los campos virtuales pueden hacer. ¿Pero es posible dentro de la consulta de búsqueda sin el uso de campos virtuales, etc.?

Gracias por adelantado

A partir de CakePHP 3.2

puede usar Query::selectTypeMap() para agregar otros tipos, que solo se usarán para transmitir los campos seleccionados cuando se recuperan los datos.

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

Puede usar cualquiera de los tipos de datos incorporados, así como los personalizados. En este caso, el campo de alias ahora se convertirá en un entero.

Ver también

  • API> \ Cake \ Database \ Query :: selectTypeMap ()
  • Libro de cocina> Acceso a la base de datos y ORM> Principios básicos de la base de datos> Tipos de datos
  • Libro de cocina> Acceso a la base de datos y ORM> Principios básicos de la base de datos> Agregar tipos personalizados

Con CakePHP 3.1 y versiones anteriores

tendrá que usar Query::typeMap() , que no solo afectará el campo seleccionado cuando se recuperan los datos, sino también en otros lugares donde los datos deben ser convertidos de acuerdo con los tipos de campo, lo que puede causar colisiones no deseadas , así que usa esto con cuidado.

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

Ver también

  • API> \ Cake \ Database \ Query :: typeMap ()

Cambiar el tipo de columnas existentes

También es posible cambiar el tipo de una columna existente de una tabla, sin embargo deben establecerse usando una syntax específica, es decir, en el formato de alias de columna utilizado por CakePHP, es decir, el alias de la tabla y el nombre de la columna separados por __ , por ej. , para una tabla con el alias Articles y una columna llamada id , serían Articles__id .

Esto se puede configurar de forma manual, o mejor aún recuperar a través de Query::aliasField() , como:

 // $field will look like ['Alias__id' => 'Alias.id'] $field = $query->aliasField('id', $table->alias()); $query ->selectTypeMap() ->addDefaults([ key($field) => 'string' ]); 

Esto cambiaría el tipo predeterminado de la columna de id a string .

Ver también

  • API> \ Cake \ Datasource \ QueryInterface :: aliasField ()

Hola, mi ejemplo alternativo completo, esquema de usuario () en el controlador. Los usuarios agregan tipo alias de columna alias por datos de unión:

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