transaction query name begin beforefind php cakephp casting cakephp-3.0 query-builder

query - table cakephp 3



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

A partir de CakePHP 3.2

puede usar Query::selectTypeMap() para agregar más tipos, que solo se usarán para convertir los campos seleccionados cuando se recuperen los datos.

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

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

Ver también

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 varios otros lugares donde los datos deben enviarse 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

Cambiar el tipo de columnas existentes

También es posible cambiar el tipo de una columna existente de una tabla, sin embargo, deben establecerse utilizando una sintaxis 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 __ , p. Ej. , para una tabla con el alias de Articles y una columna llamada id , sería Articles__id .

Esto puede establecerse manualmente o, mejor aún, recuperarse 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 id a string .

Ver también

CUANDO trato de hacer:

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

El resultado que obtengo tiene id como una cadena.

Si lo hago:

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

entonces 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.

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

Gracias por adelantado


Hola, mi ejemplo alternativo completo, esquema de usuario () en el controlador Los usuarios agregan tipo columna aliasFiels 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();