Question

Je donne Kohana un essai et je tente d'utiliser l'ORM + AOP + base de données MySQL, et je ne semble pas trouver une réponse dans Google ou SO.

I ont à la fois les modules de base de données et ORM activés, et I ont mis en PDO par défaut dans les modules / base de données / config / database.php

J'ai un contrôleur simple, et un modèle simple:

application MODÈLE / classes / modèle / blogpost.php:

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

CONTRÔLEUR: en application / cours / contrôleur / 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

je reçois l'erreur suivante lorsque je tente de lancer le test:

Kohana_Exception [0]: Méthode de base de données list_columns ne sont pas pris en charge par Kohana_Database_PDO

J'ai fait une recherche dans google et débordement de la pile, et mon impression est que ORM peut ne pas fonctionner avec AOP, est-ce correct? ou suis-je manque quelque chose?

Merci.

Était-ce utile?

La solution

list_columns est utilisé pour ORM pour obtenir toutes les colonnes d'une table quand ils ne sont pas spécifiés. Pour contourner ce problème, vous pouvez spécifier les colonnes de la table dans la propriété protégée _table_columns:

class Model_Blogpost extends ORM {
  protected $_table_name  = 'blog_post';
  protected $_table_columns = array(
    'column1' => NULL,
    'column2' => NULL,
    // ...
    'columnx' => NULL,
  ); 
}

Cela garantira que list_columns est pas appelé. L'inconvénient est que vous devrez garder une trace de chaque changement à la table que vous faites. L'avantage est qu'une requête SHOW FULL COLUMNS supplémentaire n'est pas appelée, ce qui signifie un petit coup de pouce de la performance.

Une autre façon consiste à remplacer la méthode de list_columns et de fournir vos propres moyens de colonnes liste avec.

Autres conseils

. Parfois, les documents de Kohana peuvent être source de confusion - ne craignez rien! le code source, alors qu'il peut paraître effrayant, est plein de commentaires et sert en fait un très bon docs.

Je viens snagged la dernière Kohana 3.3, et voici un lien vers l'aide pourquoi PDO est pas pris en charge en mode natif avec ORM: http://dev.kohanaframework.org/issues/3412 A savoir,

Il n'y a aucun moyen agnostique pour mettre en œuvre la liste des tables et des colonnes.

Alors, euh je pris un moment pour essayer de le soutenir depuis décrivant chaque table ressemblait à beaucoup de travail, mais cette réponse est appréciée!

Alors, dans votre MODPATH ou APPPATH (selon l'endroit où vous chargez vos trucs de base de données) un nouveau fichier à% au-dessus% / classes / Base de données / AOP / 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;
    }
}

Qu'est-ce que cela est vraiment, moi la copie du% MODPATH% / base de données / classes / Kohana / bases de données / MySQL.php list_column et de faire un coup sec ($ taper au lieu de $ colonne [ 'type']) et il semble fonctionner le peu que je l'ai testé jusqu'à présent.

SECOND, vous devez utiliser le nouveau pilote. Cela se fait en changeant votre% path% / base de données / config / database.php champ 'type' de PDO à PDO_MySQL.

Permettez-moi de savoir si cela est pas clair, ou si vous voyez des problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top