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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top