hello - cakephp tutorial 3
¿Cómo creo un par keyValue(campo de visualización) combinando/teniendo dos campos en CakePHP 3? (2)
Necesito ayuda para obtener dos valores (para el menú desplegable amigable para los seres humanos) en un par de clave-valor usando find o get o cualquier otra cosa. Necesito ayuda con el método más simple de hacer esto en CakePHP.
Aquí está mi intento:
en mi controlador
$users = $this->LocationsUser->Users->find(''list'', [ ''limit'' => 1, ''keyField'' => ''id'', ''valueField'' => [''first_name'', ''last_name''] ])->where([''id'' => $id]);
en mi vista
echo $this->Form->input(''user_id'', [ ''options'' => $users, ''type'' => ''select'', ''multiple'' => false, ]);
El resultado en mi lista desplegable:
<option value="10">Fabian;Pankiers</option>
Vea Necesito un resultado sin el punto y coma ";" . Ahora puedo usar javascript para eliminar el punto y coma, pero eso es exagerado. ¿Hay una manera simple de lograr esto dentro de CakePHP 3?
Solución simple y rápida, funcionó como un encanto ( CakePHP 3.2.6 ):
$users = $this->LocationsUser->Users->find(''list'', [
''limit'' => 1,
''keyField'' => ''id'',
''valueField'' => function ($e) {
return $e->get(''first_name''). '' '' . $e->get(''last_name'');
}
])->where([''id'' => $id]);
Hay varias formas de resolver esto, aquí hay tres de ellos:
Use una devolución de llamada para el valor valueField
Utilice una devolución de llamada y cose el valor usando valores de los resultados.
$query = $this->LocationsUser->Users
->find(''list'', [
''valueField'' => function ($row) {
return $row[''first_name''] . '' '' . $row[''last_name''];
}
])
->where([''id'' => $id]);
Ver también
Formateadores de resultados
Use un formateador de resultados que sume los valores, eso es lo que el buscador de list
hace internamente, y básicamente lo mismo que el ejemplo anterior, simplemente más complicado.
$query = $this->LocationsUser->Users
->find()
->select([''id'', ''first_name'', ''last_name''])
->formatResults(function($results) {
/* @var $results /Cake/Datasource/ResultSetInterface|/Cake/Collection/CollectionInterface */
return $results->combine(
''id'',
function($row) {
return $row[''first_name''] . '' '' . $row[''last_name''];
}
);
})
->where([''id'' => $id]);
Combinado con propiedades virtuales
También podría usar (re) usar propiedades virtuales aquí, dado por ejemplo un nombre de propiedad full_name
definido en su clase de entidad de User
:
protected function _getFullName()
{
return $this->_properties[''first_name''] . '' '' . $this->_properties[''last_name''];
}
Simplemente puede devolver eso en el formateador en lugar de combinar manualmente los dos campos nuevamente:
function($row) {
return $row[''full_name''];
}
Lo mismo podría hacerse en el ejemplo de valueField
.
Ver también
- Libro de cocina> Acceso a bases de datos y ORM> Constructor de consultas> Las consultas son objetos de colección
- Libro de cocina> Acceso a la base de datos y ORM> Constructor de consultas> Agregar campos calculados
- Libro de cocina> Acceso a la base de datos y ORM> Entidades> Creación de propiedades virtuales
Campos computados
Agregue un campo calculado y use ese para la opción valueField
$query = $this->LocationsUser->Users
->find(''list'', [
''keyField'' => ''id'',
''valueField'' => ''concatenated''
]);
$query
->select([
''id'',
''concatenated'' => $query->func()->concat([
''first_name'' => ''literal'',
'' '',
''last_name'' => ''literal''
])
])
->where([''id'' => $id]);
Ver también
Anular el buscador de listas
Si desea que siempre se aplique su lista personalizada, puede anular el buscador de list
en la clase de la tabla Users
.
use Cake/ORM/Query;
// ...
public function findList(Query $query, array $options)
{
return $query
->find()
->select([''id'', ''first_name'', ''last_name''])
// etc ...
;
}
De esa manera, puede continuar utilizando find(''list'')
.
Ver también