DooPHPのORMについてのメモ

DooPHPとは、「すんげぇ軽いぞ」というのをうたってるPHPのフレームワークです。作り的には、yiiを安っぽくした感じを受けました。で、その「すんげぇ軽いぞ」を鵜呑みにしたまま、DooPHPをいじくってたのですが、なんせ日本語の資料が皆無のため、英語嫌い(必要なのは重々承知していますが)の私には、ソースコードとにらめっこするしか手段がなく、ORM関連のとこでいろいろと調べたのでメモっておきます(メモなので、ころころ書き換えます。鵜呑みにしないでください)。

まずはじめに

  • ModelはDooModelを継承しておく方がいい。
  • db.conf.phpにリレーションシップを記述しておく。(has_many, has_one, belongs_to)

Modelの中身

  • テーブルのフィールドは、パブリックメンバにしておく
  • $_tableにはテーブル名を文字列で設定
  • $_primarykeyには主キーを文字列で設定(複合主キーの場合の設定方法がわかりませんでした。)
  • $_fieldsには全フィールドを配列で設定
  • getVRulesメソッドを作っておくと、validateメソッドを呼び出したときに
    指定のルールにしたがって、値を検証してくれる。

データの取得方法 - find

1
2
3
4
// 一番基本?の使い方
$model->id = 1;
// id が 1 のデータを検索・取得する
$results = $model->find($option);

で、or 検索とか like 検索とかしたいんだけどって場合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// DooDbExpressionの引数 一つ目が値、二つ目がORかどうか、三つ目が値をバインドするかどうか
// LIKE検索
$model->id = new DooDbExpression('LIKE xxxxxx');
$results = $model->find($option);
// is null検索
$model->id = new DooDbExpression('IS NULL');
$results = $model->find($option);
// or 検索
$model->id = new DooDbExpression('IS NULL');
$model->name = new DooDbExpression('IS NULL', true);
$results = $model->find($option);
// != 検索
$model->id = new DooDbExpression('!= 1', false, true);
$results = $model->find($option);

##オプションについて

オプション 設定値
select SELECT句からFROM句の間の部分を記述
limit LIMIT句以降の部分を記述
where WHERE文を記述。(WHERE句は不要)
filters ※意外と重要 JOIN句を指定するためのオプション。あらかじめリレーションシップの指定をしておくこと。 結合するテーブルごとに配列で設定する
1
2
3
4
5
6
7
8
9
10
11
12
13
// model モデル名 もしくは モデルオブジェクト
// joinType 結合方法
// where 条件
// param バインドする値
'filters' => array(
array('model' => 'Model1')
, array('model' => 'Model2',
'joinType' => 'LEFT OUTER',
'where' => 'aaa = ? and ccc = ?',
'param' => array('dddd', 'bbbb'))
, array('model' => $model3,
'joinType' => 'INNER')
)
groupby GROUP BY文を記述。(GROUP BY句は不要)
asc 昇順にしたいフィールドをひとつだけ指定 ※descオプションが指定されている場合は、配列の要素の順番にあわせて指定される
desc降順にしたいフィールドをひとつだけ指定 ※ascオプションが指定されている場合は、配列の要素の順番にあわせて指定される
customなんでもいれることができる。ただし、他のオプションとの兼ね合いがある。 主な使い方は、ORDERの指定に使うかな(この場合は、asc、descオプションは指定しない)?
asArrayboolean値で指定。trueの場合、配列で結果が返ってくる

##データの取得方法 - getほにゃらら

1
2
3
4
5
6
7
// getByにつづけてフィールド名を記載する。
// フィールド名は _ で複数指定することができる
$model->getByField1(1);
$model->getByField1_Field2(1, 'aaa');
$model->getByField1_Field2_Field3(1, 'aaa', 'bbbb');
// _firstをつけると先頭の一行だけを取得する。
$model->getByField1_first(1);

##データの取得方法 - relateほにゃらら

1
2
3
4
5
6
7
8
// relateにつづけてモデルのクラス名を記載する。
$model->relateModelClassName();
// 引数には、モデルのオブジェクトもしくはオプション配列を設定できる
$model->relateModelClassName($model);
$model->relateModelClassName($option);
$model->relateModelClassName($model, $option);
// _firstをつけると先頭の一行だけを取得する。
$model->relateModel2_first();

##データの取得方法 - relateMany

1
2
3
4
5
6
7
// 複数のリレーションをまとめて取得したい場合に使う
$model->relateMany(array('Model1','Model2','Model3'), $option);
// オプションの指定は、それぞれのリレーションするモデルごとに記述する必要がある
$option = array (
'Model1' => array('where' => 'xxxxxx')
, 'Model2' => array('where' => 'xxxxxx')
);

relateManyは、まとめて結合するイメージではなく、ひとつづつ結合した結果をプログラムで組み合わせてるようです。スピードを重視するならあまり使わないほうがいいかもしれないです。