Como ejecutar una función de base de datos en un query de Cakephp 3.6
|Si bien el ORM que implementa CakePHP es muy bueno, hay cosas que no vienen por defecto para utilizar, funciones muy específicas de cada base de datos por ejemplo, sería demasiado trabajo que el equipo intentase agregar todas ellas.
Si bien hay algunas comunes disponibles como el count() solo para dar un ejemplo, habrán veces que vamos a tener que ejecutar una función específica de la base de datos. En el ejemplo que vamos a ver quiero ejecutar una función para desencriptar datos con la función pgp_pub_decrypt() de PostgreSQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$tabla = $this->getTableLocator()->get('Tabla'); $query = $tabla->query(); $datos = $tabla->find('all', [ 'fields' => [ 'campo_desencriptado' => $query->func()->pgp_pub_decrypt([ "decode(AQUI_CAMPO_ENCRIPTADO, 'base64'), dearmor('MI_LLAVE_PRIVADA'), 'MI_CONTRASENA'" => 'literal' ]) ], 'conditions' => [ 'id' => 1 ] ])->first(); debug($datos); |
En esto lo importante es la Fila 6. Aquí "campo_desencriptado" es el alias de como se le va a llamar a la columna con el resultado. A esta le asignamos $query->func()->pgp_pub_decrypt(), en la cual estamos diciendo que vamos a ejecutar la función de base de datos llamada pgp_pub_decrypt(). Como parámetros de esa función pasamos el contenido de la Fila 7 en un arreglo y como ven al final le estamos indicando que debe ejecutar todo eso de forma literal (esa es la parte importante), sino haría un escape del contenido y probablemente lo transformaría a un texto.
Es importante indicar que pgp_pub_decrypt() no existe dentro del ORM de CakePHP y esto va a pasar probablemente con la función que tu quieras implementar, lo importante es al final indicarle que estamos ejecutando toda esa sección de query de forma literal.
Documentación de CakePHP:
https://book.cakephp.org/3/en/orm/query-builder.html#function-arguments