まとメモ

29才でエンジニアに転職したエンジニアのメモ

FuelPHP DBへのアクセス方法

FuelPHP DBへのアクセス方法


FuelPHPでDBにアクセスする方法をまとめました。

〜理由〜

  • SQLを書くたびに毎回調べながらやっているので、自分なりに一度まとめたほうがいいと思いました。
  • 正直DBクラスとかORMとかちゃんと理解出来ていない。。。

1.DB::query()メソッド(DBクラス)


DB - クラス - FuelPHP ドキュメント
query($sql, $type = null)
query メソッドは、新しい Database_Query_Builder オブジェクトを返します。

オブジェクトで受け取る

$result = DB::query('SELECT * FROM users')->as_object()->execute();

連想配列で受け取る

$result = DB::query('SELECT * FROM users')->execute()->as_array();
  • SQLをそのまま書きたいときに利用する。

  • 備考 最近

DB::last_query();

を覚えました。

プレースホルダー 入力された値の扱い(セキュリティ)

2.クエリビルダー(DBクラス)


Query Builder Select - クラス - FuelPHP ドキュメント

クエリビルダーはSQL文をメソッドで組み立てるもの。

オブジェクトで受け取る

$result = DB::select()->from('users')->as_object()->execute();

連想配列で受け取る

$result = DB::select()->from('users')->execute()->as_array();

いくつレコードが取得できたか知りたい

どのようにcountしたら早いか

$result = DB::select('*')->from('users')->execute();
// ただ結果をカウントするだけ。int が返ります。
$num_rows = count($result);
  • エスケープ データベース操作の際、カラム名と値 は、デフォルトでエスケープされます。いくつかの場面で値をエスケープしたくないと思うでしょう。DBクラスはデータベース表現を作成する機能、DB::expr を提供します。もし値をエスケープされるのを望まない場合、データベース表現の中でそれを囲んでください。 データベース表現は COUNTのようなMySQLのネイティブ関数 やDEFAULT のような定数を扱う際に特に有用です。
// SELECT COUNT(*) FROM `users`
$result = DB::select(DB::expr('COUNT(*) as count'))->from('users')->execute();

エスケープは小難しいSQLを書く場合に使える QueryBuilderで小難しいSELECT文を書くためのノウハウ #FuelPHPAdvent2012 - Dazing days

3.Model_Crudクラス


Model_Crud - クラス - FuelPHP ドキュメント

FuelPHP Model_Crud�N���X FuelPHPのModel_Crudクラスは、基本的なCRUD (Create, Read, Update, Delete)操作のメソッドを提供している。Model_Crudクラスを継承したサブクラスは、テーブル名や主キーなどのプロパティを定義するだけで、基本的なCRUD操作を行うことができる。

  • オブジェクトで受け取る

モデルクラスの作成:

class Model_Db_Crud extends Model_Crud
{
    protected static $_table_name = 'forms';
    protected static $_created_at = 'created_at';
    protected static $_updated_at = 'updated_at';
}

コントローラで呼び出す:

$result = Model_Db_Crud::find_all();

4. ORMパッケージ


CRUD - Orm Package - FuelPHP ドキュメント

ORMパッケージはテーブル間の関係を処理できるORMです。 HasOne、HasMany、ManyManyという関係を処理できる他、バリデーション、論理削除、テンポラルモデル、ネスティドセット、EAVコンテナの機能もあります。 オブザーバが用意されており、特定のイベントに動作を追加することもできます。 Model_Crudより高機能ですが、その分、オーバーヘッドも大きくなります。

  • オブジェクトで受け取る

モデルクラス:

class Model_Db_Orm extends \Orm\Model
{
    protected static $_table_name = 'forms';

    protected static $_properties = array(
        'id',
        'name',
        'email',
        'comment',
        'ip_address',
        'user_agent',
        'created_at',
        'updated_at',
    );

    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_save'),
            'mysql_timestamp' => false,
        ),
    );
}

コントローラで呼び出す

$result = Model_Db_Orm::find('all');

備考

$employee = Model_Employee::find(1);
$employee->delete(); // この従業員はまさに論理削除されました
  • ORM Observer

    イベントベースになっていて、特定のイベント発生時に処理を行うことが出来る。 たとえば、before_insert, before_save, after_loadなどのタイミング。 標準でいくつかのオブザーバが付属していて、自前で作ることもできる。 FuelPHPのORM Observerはとても便利 - Qiita

〜まとめ〜

  • おおまかだが、DBにアクセスする方法の違いがわかった
  • 今後は状況によってどのようにDBにアクセスすべきか考える