Kohana 3.2 ORM и PDO - PullRequest
       7

Kohana 3.2 ORM и PDO

14 голосов
/ 06 сентября 2011

Я пытаюсь использовать Kohana и пытаюсь использовать базу данных ORM + PDO + MySQL, и я не вижу ответа в Google или SO.

У меня есть база данных иМодули ORM включены, и я установил PDO по умолчанию в modules / database / config / database.php

У меня есть простой контроллер и простая модель:

Приложение МОДЕЛЬ / классы / модель/blogpost.php:

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

КОНТРОЛЛЕР: в приложении / 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

При попытке запустить тест я получаю следующую ошибку:

Kohana_Exception [0]: метод базы данных list_columns не поддерживается Kohana_Database_PDO

Я выполнил поиск в Google и Stack Overflow, и у меня сложилось впечатление, что ORM может не работать с PDO, это правильно?или я что-то упустил?

Спасибо.

Ответы [ 3 ]

17 голосов
/ 06 сентября 2011

list_columns используется для ORM, чтобы получить все столбцы в таблице, когда они не указаны.Чтобы обойти это, вы можете указать столбцы таблицы в защищенном свойстве _table_columns:

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

Это гарантирует, что list_columns не вызывается.Недостатком является то, что вам придется отслеживать каждое изменение в таблице, которую вы делаете.Положительным моментом является то, что дополнительный SHOW FULL COLUMNS запрос не вызывается, что означает небольшое повышение производительности.

Другой способ - переопределить метод list_columns и предоставить собственные средства перечисления столбцов.

3 голосов
/ 06 сентября 2011

здесь .Иногда документы Коханы могут сбивать с толку - никогда не бойтесь!исходный код, хотя он может показаться страшным, полон комментариев и фактически служит действительно хорошим документом.

2 голосов
/ 04 октября 2013

Я только что схватил последнюю версию Kohana 3.3, и вот ссылка, которая поможет понять, почему PDO изначально не поддерживается с ORM: http://dev.kohanaframework.org/issues/3412 А именно,

Агностического пути нетреализовать списки таблиц и столбцов.

Итак, я потратил немного времени, чтобы попытаться поддержать его, поскольку описание каждой таблицы звучало как большая работа, хотя этот ответ приветствуется!

Итак, в вашей MODPATH или APPPATH (в зависимости от того, где вы загружаете свою базу данных) создайте новый файл на% выше% / 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;
    }
}

Что это на самом деле,я копирую% MODPATH% / database / classes / Kohana / database / MySQL.php list_column и делаю один твик ($ type вместо $ column ['type']), и он, кажется, работает с тем, что я немного протестировал, поэтомудалеко.

ВТОРОЕ, вам нужно использовать новый драйвер.Это можно сделать, изменив поле «type»% path% / database / config / database.php с PDO на PDO_MySQL.

Дайте мне знать, если это не ясно, или если вы видите проблемы.

...