Orm
ORMはオブジェクト
関係マッピングの略です。 これは、2つのことを行います: オブジェクトにデータベースのテーブルの行をマップし、
それはあなたがそれらのオブジェクト間の関係を確立することができます。
それは
Active Record パターンに従いますが、 他のシステムに影響も受けます。
モデルの作成
モデルは少しの時間で作る事ができます, 規則では Model_ プレフィックスをクラス名につけます。 (ファイル名が、article.phpなら、Model_Articleとします。) そして、 app/classes/model/に従って設置をしますが、あなたが選択した任意の名前を 自由に使用することができます。
class Model_Article extends Orm\Model {}
この方式はデータベースからモデルのプロパティを取得する必要があるため、 mysqlドライバとmysqliドライバでのみ動作します。しかし、カラムの名前を取得するために常に一つのモデル毎に 余分なクエリが一つ実行されるため、大変非効率であり、この方式を使うことは推奨されません。
class Model_Article extends Orm\Model
{
protected static $_properties = array('id', 'title', 'contents', 'publish');
}
設定
あなたはモデルを設定するために静的なプロパティを追加することができます。
先ほど示したように、$_propertiesを設定することは必須ではありませんが、設定を行う事を推奨します。
これらのプロパティは publicもしくはprotectedで宣言します。
privateで宣言すべきではありません。
すべての設定プロパティーは、カラム名との衝突を避けるために先頭に"_"(一つのアンダースコア)がつけられていることに注意して下さい。
protected static $_table_name
このプロパティが設定されていないとき、クラス名からModel_プリフィクスを削除し、英単語が複数形にされたものがテーブル名として期待されます。 "Model_Article"クラスはテーブル名として"articles"を期待します。 もしこの規約に従わない場合は、$_table_nameプロパティを設定することでテーブル名を変更することができます。
class Model_Article extends Orm\Model
{
protected static $_table_name = 'myarticles';
}
protected static $_primary_key
デフォルトではarray('id')がセットされています。別の列名または複数の主キーを使用する場合は、 このプロパティを設定する必要があります。
class Model_Article extends Orm\Model
{
protected static $_primary_key = array('aid');
}
主キーは、一意で不変な本当の主キーでなければなりません。
PKの値は変えられないため、
他の目的(一対一の外部キーなど)に使ってはいけません。
ORM はこのチェックを行わないため、一見してうまくいっていても後で問題になります。
PK は auto_increment にすることが望ましいですが、絶対ではありません。
最初にデータを登録する時だけ指定出来ますが、一度セットしたら不変となります。
protected static $_properties
すでに、モデルのプロパティを追加するシンプルな例は提示しました。 カラムに対して、型、ラベル、バリデーションを設定することも可能です。
class Model_Article extends Orm\Model
{
protected static $_properties = array(
'id', // PKではバリデーション、型、オブザーバは無視されます
'name' => array(
'data_type' => 'varchar',
'label' => 'Article Name',
'validation' => array('required', 'min_length' => array(3), 'max_length' => array(20)),
'form' => array('type' => 'text'),
'default' => 'New article',
),
'gender' => array(
'data_type' => 'varchar',
'label' => 'Gender',
'form' => array('type' => 'select', 'options' => array('m' => 'Male', 'f' => 'Female')),
'validation' => array('required'),
),
'created_at' => array(
'data_type' => 'int',
'label' => 'Created At',
'form' => array(
'type' => false, // このフィールドは、formが表示される際に、レンダリングされません。
),
),
'updated_at' => array('data_type' => 'int', 'label' => 'Updated At')
);
}
この例に示すように、フォームの属性を配列の形で渡すことができます。
例のように、バリデーションのルールはarray('required')のような単純なルールでも、 array('min_length' => array(3))のようにパラメータつきのもののどちらでも渡すことができます。 バリデーションクラスの規約の完全な説明はCoreを 参照してください。
protected static $_conditions
既定ではこのプロパティはセットされておらず、 Model::condition()はarray()を返します。 もし、それぞれのクエリが実行される時に何かの条件を指定したければ、モデル上で設定することが可能です。 現時点では'order_by'条件と'where'条件が指定可能です。
class Model_Article extends Orm\Model
{
protected static $_conditions = array(
'order_by' => array('id' => 'desc'),
'where' => array(
array('publish_date', '>', time()),
array('published', '=', 1),
),
);
}
order_by条件は他のorder_by節が定義されていないときのみ有効です。 where条件は他のwhere節が定義されている場合、andで追加されます。
protected static $_has_one, $_belongs_to, $_has_many, $_many_many
お互いのモデルを関連することは、 Relating Modelsで説明しています。
protected static $_connection
既定ではこのプロパティはセットされておらず、Model::connection()はnullを返します。 もし、app/config/db.phpで設定された他のデータベースを設定することも可能です。
protected static $_write_connection
もし、データベースがmaster/slave環境で構成されている場合、masterに対するwriteに使用するconnectionを指定することができます。 もしこのプロパティが設定されている場合、$_connectionはslaveに対するreadに利用されます。
既定ではこのプロパティはセットされておらず、Model::connection(true)は設定された$_connection、 もしくはnullを返します。 app/config/db.phpで設定された他のデータベースを設定することも可能です。
// シングル構成のデータベースを利用する場合の設定
class Model_Article extends Orm\Model
{
// 'articles_db' は db.php で設定されている必要がある
protected static $_connection = 'articles_db';
}
// master/slave構成のデータベースを利用する場合の設定
class Model_Article extends Orm\Model
{
// 'articles_master_db' と 'articles_slave_db' は db.php で設定されている必要がある
protected static $_write_connection = 'articles_master_db';
protected static $_connection = 'articles_slave_db';
}
リレーションは同じコネクション上でしか利用できません。 このため、もし、モデル内でコネクションを設定する場合は、リレーションを設定するモデルがread、writeの両方で同じコネクションを使うように十分注意してください。
protected static $_to_array_exclude
APIドリブンなアプリケーションを作成する場合、しばしばAPIに公開するカラムを制限したくなる場合があります。 たとえば、userを管理するレコードをAPIから参照する場合、 パスワードやログインハッシュ、saltを公開する必要はありません。
モデルの定義において、to_array_excludeにカラム名を追加することで、 to_array()の結果から除外することができます。
class Model_User extends Orm\Model
{
protected static $_to_array_exclude = array(
'password', 'login_hash', 'salt' // exclude these columns from being exported
);
}
既定ではto_array()メソッドは現在のモデルのカラムとリレーションにより読み出されたデータの両方を出力します。 必要に応じてカスタムプロパティも出力することが可能です。 配列による除外は、カラム、カスタムプロパティ、リレーションのすべてを除外することができます。
protected static $_observers
オブザーバーの追加については Observersで説明されています。