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
- API> / Cake / Database / Query :: selectTypeMap ()
- Libro de cocina> Acceso a bases de datos y ORM> Conceptos básicos de bases de datos> Tipos de datos
- Libro de cocina> Acceso a bases de datos y ORM> Conceptos básicos de bases 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 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();