モデル

モデルとは?

データを取得し、操作し、あるいはそれを消去したい場合、その処理は常にモデルによって行われるべきです。モデルは、ある種のデータ表現であり、 データを変化させるメソッドを持ちます。たとえば。コントローラには SQL クエリを一切記述せず、モデル側にそれを記述し、コントローラではモデルが実行したクエリを呼び出す、 というような処理が出来ます。この方法によって、データベースを変更した時もコントローラを書き換える必要はなく、データベースに影響を及ぼすモデルのみを書き換えるだけですむのです。

どのようにモデルを使うか?

Fuel において、モデルの本質は単なる クラス です。他のものと同様なのです。つまりライブラリ以外のなにものでもありません。 ただし Model_ プレフィックスが付いているので、他のクラスと見分けを付けることが容易になります。モデルを有効に使うためには、他のクラスを必要とするでしょう。

モデルを作る


namespace Model;

class Welcome extends \Model {

    public static function get_results()
    {
        // データベースに対する処理
    }

}

現在の名前空間の外部にあるグローバルからクラスを使う時には、 バックスラッシュをプレフィックスとしてつけることを忘れないでください。もしこの点について理解していない場合は、 PHP.net の名前空間に関する部分を読んでください。

モデルへのアクセス

PHP は、現在の名前空間にクラスをインポートするための use キーワードをもっています。 このキーワードによって、特定のクラスのファイルの中で、モデルクラス名 Model\WelcomeWelcome という単純な名前に短縮出来ます。


use \Model\Welcome;

class Controller_Welcome extends Controller
{
    public function action_index()
    {
        $results = Welcome::get_results();
    }
}   

モデルを書く

モデルは、どのようなかたちのデータストレージに対しても使うことができますが、ここでは SQL での利用に焦点を当てましょう。というのも、 それが最もよく使われているものだからです。ほとんど常だと思いますが、作られるモデルには少なくとも CRUD メソッド: create, read, update, delete (あるいはそれらのバリエーション) の 4 つが全て含まれているはずです。Fuel においては、 モデルは、デフォルトでは何も継承する必要がありません。 もちろん、自分なりのベースモデルを作ることや Fuel の Orm パッケージ を使うことも出来ます。

SQL クエリを書く

DB クラス を使ってネイティブな SQL クエリを次のように作成することが出来ます:

DB::query('SELECT * FROM users WHERE id = 5');

クエリビルダを使う

データをエスケープする、データを配列で使う、あるいは複数のデータベースエンジンを跨ぐことが出来るようなアプリケーションを作る、このような時、 ネイティブな SQL が重荷になることがあります。DB クラスのクエリビルダのメソッドを用いれば、ネイティブ SQL を抽象化して書くことが出来ます。

DB::select('title','content')->from('articles')->execute()->get('title');

ネイティブ SQL クエリとクエリビルダの利用については DB クラス のドキュメントをご覧ください。

モデル作成のために Model_Crud を使う

モデルを作るための有効な方法の一つは Model_Crud を使うことです。これはデータベースのテーブルとのやりとりに必要な一般的な機能を提供し、以下のように使用します。

// 全ての記事を探し出す
$entry = Model_Article::find_all();

// 日付逆順でカテゴリ 1 に属する全ての記事を探し出す
$entry = Model_Article::find(array(
    'where' => array('category_id', 1),
    'order_by' => array('date' => 'desc')
));

モデル作成のために Orm パッケージを使う

リレーションのサポートなどモデルのためのもっと多くの機能が必要なら、 Orm パッケージを使うこともできます。これはあなたのモデルにとんでもなく多くの機能を追加します。以下のように使用します。

// 全ての記事を探し出す
$entry = Model_Article::find('all');

// 日付逆順でカテゴリ 1 に属する全ての記事を探し出す
$entry = Model_Article::find('all', array(
    'where' => array('category_id', 1),
    'order_by' => array('date', 'desc')
));

Model_Crud と ORM パッケージは似た構文を持っています。これは Model_Crud が提供するより多くの機能が必要になった時に、簡単に Orm に移行できるようにするためです。