Kohana 3.2 ormおよびPDO
-
26-10-2019 - |
質問
Kohanaに試してみて、Orm + PDO + MySQLデータベースを使用しようとしていましたが、Googleなどで答えを見つけていないようです。
データベースモジュールとORMモジュールの両方を有効にしており、Modules/Database/Config/Database.phpでPDOをデフォルトとして設定しました
シンプルなコントローラーとシンプルなモデルがあります。
モデルアプリケーション/クラス/モデル/blogpost.php:
<?php
class Model_Blogpost extends ORM {
protected $_table_name = 'blog_post';
}
コントローラー:アプリケーション/クラス/コントローラー/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で動作しない可能性があるという印象は正しいですか?それとも私は何かが足りませんか?
ありがとうございました。
解決
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
方法と、それを使用して列をリストする独自の手段を提供します。
他のヒント
ここ. 。 Kohanaのドキュメントが混乱することもあります - 決して恐れないでください!ソースコードは怖いかもしれませんが、コメントでいっぱいで、実際には本当に良いドキュメントとして機能します。
私は最新のコハナ3.3を手に入れましたが、PDOがORMでネイティブにサポートされていない理由を確認するためのリンクを次に示します。 http://dev.kohanaframework.org/issues/3412つまり、
リストテーブルと列を実装する不可知論の方法はありません。
だから、ええと、私はそれをサポートしようと試みました。なぜなら、すべてのテーブルを多くの作業のように説明しているからですが、その答えは高く評価されています!
したがって、modpathまたはapppathで(データベースのロード場所に応じて)
<?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/databases/mysql.php list_columnをコピーして、1つの微調整($列の代わりに$タイプ['type'])を実行しています。私はこれまでテストしました。
第二に、新しいドライバーを使用する必要があります。これは、PDOからPDO_MYSQLに%パス/データベース/config/database.php 'type'フィールドを変更することによって行われます。
これが明確でないかどうか、または問題が見られるかどうかを教えてください。