Kohana 3.2 Orm y PDO
-
26-10-2019 - |
Pregunta
Estoy probando a Kohana y estaba tratando de usar la base de datos ORM + PDO + MySQL, y no parece que encuentre una respuesta en Google más o menos.
Tengo habilitados los módulos de base de datos y ORM, y he establecido PDO como predeterminado en módulos/base de datos/config/database.php
Tengo un controlador simple y un modelo simple:
Aplicación modelo/clases/modelo/blogpost.php:
<?php
class Model_Blogpost extends ORM {
protected $_table_name = 'blog_post';
}
Controlador: en aplicaciones/clases/controlador/bienvenido.php
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Welcome extends Controller {
public function action_index() {
$Blog_Post = ORM::factory('blogpost'); // ==> ERROR HERE
$Blog_Post->name = 'test1';
$Blog_Post->description = 'this is a quick test';
$Blog_Post->content = 'The content goes here....';
$Blog_Post->save();
$id = $Blog_Post->id;
$Blog_Post = ORM::factory('blogpost', $id);
$view->Blog_Post = $Blog_Post;
$this->response->body($view);
}
} // End Welcome
Recibo el siguiente error cuando intento ejecutar la prueba:
Kohana_Exception [0]: el método de la base de datos List_columns no es compatible con KOHANA_DATABASE_PDO
He hecho una búsqueda en Google y Stack Overflow, y mi impresión es que ORM puede no funcionar con PDO, ¿es correcto? ¿O me estoy perdiendo algo?
Gracias.
Solución
list_columns
se usa para Orm para obtener todas las columnas en una tabla cuando no se especifican. Para evitar esto, puede especificar las columnas de la tabla en el _table_columns
Propiedad protegida:
class Model_Blogpost extends ORM {
protected $_table_name = 'blog_post';
protected $_table_columns = array(
'column1' => NULL,
'column2' => NULL,
// ...
'columnx' => NULL,
);
}
Esto asegurará que list_columns
no se llama. La desventaja es que tendrá que realizar un seguimiento de cada cambio en la mesa que realice. La ventaja es que un extra SHOW FULL COLUMNS
La consulta no se llama, lo que significa un pequeño impulso de rendimiento.
Otra forma es anular el list_columns
método y proporcionar sus propios medios para enumerar columnas con él.
Otros consejos
aquí. A veces los documentos de Kohana pueden ser confusos, ¡no temas! El código fuente, aunque puede sonar aterrador, está lleno de comentarios y en realidad sirve como un muy buen documento.
Acabo de enganchar el último Kohana 3.3, y aquí hay un enlace para ayudar a ver por qué PDO no es compatible de forma nativa con ORM: http://dev.kohanaframework.org/issues/3412A saber,
No existe una forma agnóstica de implementar tablas y columnas de listado.
Entonces, me tomé un momento para tratar de apoyarlo, ya que describir cada mesa sonaba como mucho trabajo, ¡aunque se agradece esa respuesta!
Entonces, en su Modpath o AppPath (dependiendo de dónde cargue sus cosas de base de datos) haga un nuevo archivo en %arriba %/classes/database/pdo/mysql.php
<?php defined('SYSPATH') or die('No direct script access.');
class Database_PDO_MySQL extends Database_PDO {
public function list_columns($table, $like = NULL, $add_prefix = TRUE)
{
// Quote the table name
$table = ($add_prefix === TRUE) ? $this->quote_table($table) : $table;
if (is_string($like))
{
// Search for column names
$result = $this->query(Database::SELECT, 'SHOW FULL COLUMNS FROM '.$table.' LIKE '.$this->quote($like), FALSE);
}
else
{
// Find all column names
$result = $this->query(Database::SELECT, 'SHOW FULL COLUMNS FROM '.$table, FALSE);
}
$count = 0;
$columns = array();
foreach ($result as $row)
{
list($type, $length) = $this->_parse_type($row['Type']);
$column = $this->datatype($type);
$column['column_name'] = $row['Field'];
$column['column_default'] = $row['Default'];
$column['data_type'] = $type;
$column['is_nullable'] = ($row['Null'] == 'YES');
$column['ordinal_position'] = ++$count;
switch ($type) //was $column['type']
{
case 'float':
if (isset($length))
{
list($column['numeric_precision'], $column['numeric_scale']) = explode(',', $length);
}
break;
case 'int':
if (isset($length))
{
// MySQL attribute
$column['display'] = $length;
}
break;
case 'string':
switch ($column['data_type'])
{
case 'binary':
case 'varbinary':
$column['character_maximum_length'] = $length;
break;
case 'char':
case 'varchar':
$column['character_maximum_length'] = $length;
case 'text':
case 'tinytext':
case 'mediumtext':
case 'longtext':
$column['collation_name'] = $row['Collation'];
break;
case 'enum':
case 'set':
$column['collation_name'] = $row['Collation'];
$column['options'] = explode('\',\'', substr($length, 1, -1));
break;
}
break;
}
// MySQL attributes
$column['comment'] = $row['Comment'];
$column['extra'] = $row['Extra'];
$column['key'] = $row['Key'];
$column['privileges'] = $row['Privileges'];
$columns[$row['Field']] = $column;
}
return $columns;
}
}
Lo que esto es realmente es que yo copié el %modpath %/database/classes/kohana/database/mysql.php list_column y haciendo un ajuste ($ type en lugar de $ columna ['type']) y parece funcionar el pequeño bit He probado hasta ahora.
En segundo lugar, debe usar el nuevo controlador. Esto se hace cambiando su campo %de ruta %/base de datos/config/database.php 'type' del campo de PDO a PDO_MYSQL.
Avíseme si esto no está claro o si ve problemas.