2014-11-06 追記
ご注意
ここで紹介する方法だと、次のステップ$ oil generate model ...で生成したデータベース構築のマイグレーションファイルで、
うまくPostgreSQLへテーブル生成ができないことがわかり、
急遽、MySQLへ路線変更しますw
とりあえず、FuelPHP経由でデータベースへ接続して、
データを抽出できることを確認したいので、
適当なデータベースを作っておきます。
参考)
【備忘録】PostgreSQL & phpPgAdmin のインストール (ubuntu14) - きまブログ
データベース(PostgreSQL)側の準備
データベースロールの作成
ブラウザからphpPgAdminへ、postgres ユーザーでログインし、
ロール (PostreSQLのユーザーみたいなの) を作成します。
「データベースの作成」だけ、できるようにします。(適当です。)
データベースの作成
一旦、postgresをログアウトし、上で、作成したロールでログインし直し、
データベースを作成します。
データベース名:fuel_dev
テンプレート:template1 ← ナゾ。
で作成しておき、テーブルを追加して、適当にデータを入れておきます。
自分で作成したロールでデータベースを作成したのに、
所有者がpostgresになるナゾ。
FuelPHPの準備 - PostgreSQL編
環境について
データベースの設定でちょっと関係するので、FuelPHPの動作環境について。
FuelPHPには、
- development(開発)
- test(評価)
- stage(ステージング)
- production(プロダクション)
という、4つの動作環境が用意されています。
それぞれ挙動が違うんだと思いますが、まだ未調査です。
ざっと見た感じエラー処理のトコロで分岐があるみたいだけど。。
stage(ステージング)というのは、一般に顧客の評価環境で、
基本的にproduction(実運用環境)と同じ環境にして動作させるモードです。
db.php の設定 - PostgreSQL編
db.phpは、FuelPHPがデータベースへ接続する時に使う設定情報で、
基本的な情報は、/fuel/core/config/db.php が反映され、
上書きしたい情報を、/fuel/app/config/development/db.php へ書き込みます。
※ 基本的にdevelopment 環境で開発するので、とりあえずココに書き込んでおきます。
fuel/app/config/development$ cat db.php <?php /** * The development database settings. These get merged with the global settings. */ return array( 'default' => array( 'connection' => array( 'dsn' => 'pgsql:host=localhost;dbname=fuel_dev', 'username' => 'user_name', 'password' => 'user_password', ), 'charset' => NULL, 'identifier' => "\"" /* for PostgreSQL */ ), );
ポイント1つ目:
'charset'=> NULL,
もともと、utf8で設定されているのを、ここでNULLへ上書き。。
データベースはUTF-8で設定してあるのになぜ?
ポイント2つ目:
'identifier' => "" /* for PostgreSQL */
これを書いておかないと、生成するテーブル名とかを`(バッククオート)で囲みます。
これは、MySQLでテーブル名に予約名が設定されていた場合にエスケープするためのようです。
つまり、ここでは、PostgreSQLを使うため、変にSQL文中にバッククオートが入るとエラーになるので、
identifierを空にしておきます。
※ ここでは空(””)にしてありますが、ダブルクオーテーション(“\”")にしてもいいかも。。
っていうか、やっぱMySQLが基本か〜。。
実行結果 - PostgreSQL編
いままでテストで作ってきたコントローラーのメソッドに、
こんな感じでデータベースのテーブル test_tableの全レコードを読み込むようにして、
結果の配列をvar_dump()で全部出力するようにしてみると。。
public function action_dbtest() { $query = DB::select()->from('test_table')->execute(); var_dump($query); }
うまく表示できました。。っていうのかなコレ。。
array['_result']にデータベースに書き込んだ内容が表示されているのでOKでは?
ここでは、identifierにダブルクオーテーションを設定してあります。
object(Fuel\Core\Database_Result_Cached)#23 (5) { ["_query":protected]=> string(26) "SELECT * FROM "test_table"" ["_result":protected]=> array(2) { [0]=> array(2) { ["id"]=> int(1) ["name"]=> string(5) "test1" } [1]=> array(2) { ["id"]=> int(2) ["name"]=> string(5) "text2" } } ["_total_rows":protected]=> int(2) ["_current_row":protected]=> int(0) ["_as_object":protected]=> bool(false) }
次回は、ついにoil generateコマンドでModelのコード自動生成?