Frage

Ich probiere Kohana aus und habe versucht, die ORM + PDO + Mysql -Datenbank zu verwenden, und ich scheine in Google keine Antwort zu finden oder so.

Ich habe sowohl die Datenbank- als auch die ORM

Ich habe einen einfachen Controller und ein einfaches Modell:

Modellanwendung/Klassen/Modell/Blogpost.php:

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

Controller: in Anwendung/Klassen/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

Ich erhalte den folgenden Fehler, wenn ich versuche, den Test auszuführen:

Kohana_exception [0]: Datenbankmethode list_columns wird nicht von kohana_database_pdo unterstützt

Ich habe eine Suche in Google und Stack Overflow durchgeführt, und mein Eindruck ist, dass ORM möglicherweise nicht mit PDO funktioniert. Ist das richtig? Oder vermisst ich etwas?

Vielen Dank.

War es hilfreich?

Lösung

list_columns wird für ORM verwendet, um alle Spalten in einer Tabelle zu erhalten, wenn sie nicht angegeben sind. Um dies zu umgehen, können Sie die Tabellenspalten in der angeben _table_columns geschützte Eigenschaft:

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

Dies wird sicherstellen list_columns wird nicht genannt. Der Nachteil ist, dass Sie jede Änderung des von Ihnen vorgenommenen Tisches verfolgen müssen. Der Vorteil ist, dass ein Extra SHOW FULL COLUMNS Die Abfrage wird nicht aufgerufen, was einen kleinen Leistungsschub bedeutet.

Eine andere Möglichkeit besteht darin, die zu überschreiben list_columns Methode und geben Sie Ihre eigenen Mittel zur Auflistung von Spalten an.

Andere Tipps

hier. Manchmal können Kohanas Dokumente verwirrend sein - niemals fürchten! Der Quellcode ist zwar beängstigend, ist jedoch voll mit Kommentaren und dient tatsächlich als wirklich gute Dokumente.

Ich habe gerade den neuesten Kohana 3.3 geschnappt, und hier ist ein Link, um zu sehen, warum PDO nicht nativ von ORM unterstützt wird: http://dev.kohanaframework.org/issues/3412Nämlich,

Es gibt keine agnostische Möglichkeit, Listentabellen und Spalten zu implementieren.

Also, ähm, ich habe mich einen Moment Zeit genommen, um es zu unterstützen, da die Beschreibung jeder Tabelle wie viel Arbeit klang, obwohl diese Antwort geschätzt wird!

Also in Ihrem Modpath oder AppPath (abhängig davon, wo Sie Ihre Datenbank -Sachen laden) erstellen

<?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;
    }
}

Was das wirklich ist, ist, dass ich das %modPath %/database/classes/kohana/datenbanken/mysql.php list_column und einen Optimierungen ($ typ anstelle von $ column ['Typ']) kopiere und es scheint das kleine Bit zu funktionieren. Ich habe bisher getestet.

Zweitens müssen Sie den neuen Fahrer verwenden. Dies erfolgt durch Ändern Ihres %path %/database/config/database.php 'type' vom pdo zu pdo_mysql.

Lassen Sie mich wissen, ob dies nicht klar ist oder ob Sie Probleme sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top