php mysql pdo kohana kohana-orm

php - Kohana 3.2 ORM y PDO



mysql kohana-orm (3)

Me acabo de enganchar el último Kohana 3.3, y aquí hay un enlace para ayudar a ver por qué DOP no es compatible de forma nativa con ORM: http://dev.kohanaframework.org/issues/3412 A saber,

No hay una manera 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 un montón de trabajo, ¡aunque se agradece esa respuesta!

Por lo tanto, en su MODPATH o APPPATH (dependiendo de dónde cargue sus datos de la base de datos), cree un nuevo archivo en% sobre% / 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 copie el% MODPATH% / database / classes / Kohana / databases / MySQL.php list_column y haga un tweak ($ ​​tipo en lugar de $ column [''type'']) y parece que funciona un poquito Lo he probado hasta ahora.

SEGUNDO, necesita usar el nuevo controlador. Esto se hace cambiando el campo% path% / database / config / database.php ''type'' de PDO a PDO_MySQL.

Avíseme si esto no está claro o si ve problemas.

Le estoy haciendo una prueba a Kohana y estaba tratando de usar la base de datos ORM + PDO + MySQL, y no parece encontrar una respuesta en google o SO.

Tengo tanto la base de datos como los módulos ORM habilitados, y he configurado PDO como predeterminado en modules / database / config / database.php

Tengo un controlador simple y un modelo simple:

MODELO application / classes / model / blogpost.php:

<?php class Model_Blogpost extends ORM { protected $_table_name = ''blog_post''; }

CONTROLADOR: en application / classes / controller / welcome.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

Me aparece el siguiente error cuando intento ejecutar la prueba:

Kohana_Exception [0]: el método de 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.


aquí . Algunas veces los documentos de Kohana pueden ser confusos, ¡nunca tengas miedo! el código fuente, aunque parezca aterrador, está LLENO de comentarios y realmente sirve como un documento realmente bueno.


list_columns se usa para ORM para obtener todas las columnas en una tabla cuando no están especificadas. Para evitar esto, puede especificar las columnas de la tabla en la propiedad protegida _table_columns :

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 sea llamado. El inconveniente es que tendrá que realizar un seguimiento de cada cambio en la tabla que realice. Lo bueno es que no se llama a una consulta SHOW FULL COLUMNS extra, lo que significa un pequeño incremento en el rendimiento.

Otra forma es anular el método list_columns y proporcionar sus propios medios para incluir columnas en él.