Enlace de ordenamiento de paginación en una propiedad de campo/entidad virtual en CakePHP 3.0
pagination jquery-ui-sortable (2)
Como se indica en los documentos vinculados, las propiedades virtuales no se pueden usar en los hallazgos. Eso es por diseño, las propiedades virtuales solo viven en entidades, están construidas en PHP después de que los datos han sido recuperados de la base de datos.
Columnas computadas
Así que olvídate de las propiedades virtuales por un momento y concéntrate en consultas y columnas calculadas.
Las columnas sortWhitelist
deben especificarse mediante sortWhitelist
Tenga en cuenta que, al igual que las columnas de los modelos asociados, las columnas calculadas deben especificarse en la opción sortWhitelist
para poder utilizarlas en la clasificación.
Libro de cocina> Controladores> Componentes> Paginación> Controle qué campos se usan para ordenar
A través de las opciones de paginación
Aquí tiene algunas opciones, por ejemplo, puede definir columnas calculadas en las opciones de paginación
$this->paginate = [
// ...
''sortWhitelist'' => [
''id'',
''first_name'',
''last_name'',
''full_name'',
// ...
],
''fields'' => [
''id'',
''first_name'',
''last_name'',
''full_name'' => $Table->query()->func()->concat([
''first_name'' => ''literal'',
''last_name'' => ''literal''
]),
// ...
],
''order'' => [
''full_name'' => ''DESC''
]
];
Un buscador personalizado
Otra opción más reutilizable sería usar un buscador personalizado
$this->paginate = [
// ...
''sortWhitelist'' => [
''id'',
''first_name'',
''last_name'',
''full_name'',
// ...
],
''finder'' => ''withFullName'',
''order'' => [
''full_name'' => ''DESC''
]
];
public function findWithFullName(/Cake/ORM/Query $query, array $options)
{
$query->select([
''id'',
''first_name'',
''last_name'',
''full_name'' => $this->query()->func()->concat([
''first_name'' => ''literal'',
''last_name'' => ''literal''
]),
// ...
]);
return $query;
}
- Libro de cocina> Controladores> Componentes> Paginación> Uso de controlador :: paginate ()
- Libro de cocina> ... ORM> Recuperar conjuntos de datos y resultados> Métodos de búsqueda personalizada
Consulta personalizada separada
También es posible pasar directamente objetos de consulta a Controller::paginate()
.
$this->paginate = [
// ...
''sortWhitelist'' => [
''id'',
''first_name'',
''last_name'',
''full_name'',
// ...
],
''order'' => [
''full_name'' => ''DESC''
]
];
$query = $this->Table
->find()
->select([
''id'',
''first_name'',
''last_name'',
''full_name'' => $this->query()->func()->concat([
''first_name'' => ''literal'',
''last_name'' => ''literal''
]),
// ...
]);
$results = $this->paginate($query);
Quiero crear un enlace de ordenamiento de paginación en una propiedad de campo / entidad virtual en CakePHP 3.0.
En CakePHP 2.x solía crear un campo virtual y luego crear un enlace de clasificación de paginación en ese campo. Sin embargo, en CakePHP 3.0, los campos virtuales han sido reemplazados por propiedades de entidades virtuales .
¿Hay alguna forma de que pueda hacer que esto funcione en CakePHP 3.0?
En mi situación, tengo una columna first_name y last_name, que se combinan como full_name en una propiedad de entidad virtual . Quiero ordenar el nombre completo.
Establezca su orden de clasificación predeterminado para que sea el mismo que su campo virtual:
public $paginate = [
''order'' => [
''first_name'' => ''ASC'',
''last_name'' => ''ASC'',
]
];
A continuación, solo agregue lo siguiente a su Vista para evitar que el paginador anule el orden predeterminado a menos que lo especifique el usuario:
if (empty($_GET[''direction''])) { $this->Paginator->options([''url'' => [''direction'' => null, ''sort'' => null]]); }