Ultimamente ando un poco vago para escribir en este Blog, pero hoy me encontré con un caso/problema/solución que me parece que vale la pena compartir con uds.
Estaba trabajando con las migraciones de esquemas de CakePHP y me encontré con que el shell "schema" no distingue los tipos de columna LONGTEXT de MySQL, omitiendo las variantes de este tipo de columna y unificandolos a todos como 'text'.
He desarrollado una solución, más o menos elegante, para que los comandos "create" y "update" del schema shell reconozcan este tipo de dato. Todavía no encuentro una forma "no-intrusiva" de hacerlo para el comando "generate".
Básicamente, se trata de hacer un nuevo Data Source de CakePHP, pero en vez de extender la clase base, extender del DboMysql y solo implementar el array de tipos de datos del motor.
Para ello, como explica el manual, creo un nuevo archivo en app/models/datasources/dbo_custom_mysql.php con el siguiente contenido:
<?php
require_once(ROOT . '/cake/libs/model/datasources/dbo/dbo_mysql.php');
class DboCustomMysql extends DboMysql {
/**
* MySQL column definition
*
* @var array
*/
var $columns = array(
'primary_key' => array('name' => 'NOT NULL AUTO_INCREMENT'),
'string' => array('name' => 'varchar', 'limit' => '255'),
'text' => array('name' => 'text'),
'longtext' => array('name' => 'longtext'),
'integer' => array('name' => 'int', 'limit' => '11', 'formatter' => 'intval'),
'float' => array('name' => 'float', 'formatter' => 'floatval'),
'datetime' => array('name' => 'datetime', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
'timestamp' => array('name' => 'timestamp', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
'time' => array('name' => 'time', 'format' => 'H:i:s', 'formatter' => 'date'),
'date' => array('name' => 'date', 'format' => 'Y-m-d', 'formatter' => 'date'),
'binary' => array('name' => 'blob'),
'boolean' => array('name' => 'tinyint', 'limit' => '1')
);
}
Como ven, lo único que hago es extender el Datasource original de MySQL de CakePHP y agregarle un nuevo tipo de columna. Nada más. Luego, en su archivo app/config/database.php sólo deben indicar que su driver es 'custom_mysql' para hacer referencia a nuestro datasource. Y listo.
Esperemos que la gente de CakePHP ponga más esmero en resolver estas cositas que deberían estar listas desde varias versiones anteriores.
