ファインダはモデルをラップしたクラスで、取得条件(コンディション)の設定を短いコードで行うことが可能です。モデル(ActiveRecordオブジェクト)ではある特定(1つ)のモデルを受け取る場合は selectOne()メソッド、モデルを複数(配列で)受け取る場合は select()メソッド を使用しました。
ファインダでは前者は fetch()、後者は fetchAll()を使用します。
$aUser = finder("User")->eq("id", 1)->fetch();
echo $aUser->name;
$users = finder("User")->eq("age", 30)->fetchAll();
foreach ($users as $aUser) {
echo $aUser->name;
}
条件を指定するメソッドの一覧です。
- eq(column, value) - columnがvalueと等しい
- neq(column, value) - columnがvalueと等しくない
- in(column, array values) - columnがvaluesのいずれかである
- nin(column, array values) - columnがvaluesのいずれでもない
- lt(column, value) - columnがvalue未満である
- le(column, value) - columnがvalue以下である
- gt(column, value) - columnがvalueより大きい
- ge(column, value) - columnがvalue以上である
- between(column, array values) - columnがvalues[from]からvalues[to]の間である(values[0]とvalues[1]でも可)
- between(column, from, to) - columnがfromからtoの間である
- bw(column, array values) - between(column, array values)のエイリアス
- bw(column, from, to) - between(column, from, to)のエイリアス
- notBetween(column, array values) - columnがvalues[from]からvalues[to]の間ではない(values[0]とvalues[1]でも可)
- notBetween(column, from, to) - columnがfromからtoの間ではない
- nbw(column, array values) - notBetween(column, array values)のエイリアス
- nbw(column, from, to) - notBetween(column, from, to)のエイリアス
- starts(column, value) - columnがvalueで始まる
- ends(column, value) - columnがvalueで終わる
- contains(column, value) - columnがvalueを含む
- isNull(column) - columnがnullである
- isNotNull(column) - columnがnullではない
条件を複数指定した場合、それらは全てAND結合されます。
下記は
前章の、「ステータスが1かつ年齢が30歳以上かつメールアドレスが"@example.com"で終わるユーザ」をファインダを用いてコーディングした例です。非常に簡潔になっていることが分かると思います。
$users = finder("User")->eq("status", 1)->ge("age", 30)->ends("email", "@example.com")->fetchAll();
foreach ($users as $aUser) {
echo $aUser->name;
}
下記も
前章の、「ステータスが1かつ年齢が25歳以上、または、ステータスが2かつ年齢が35歳以上のユーザ」のファインダで書き直した例です。10行ほどのコードが、1行で書けてしまいます。
$users = finder("User")->ow(aw(eq("status", 1), ge("age", 25)), aw(eq("status", 2), ge("age", 35)))->fetchAll();
foreach ($users as $aUser) {
echo $aUser->name;
}
並び替えは sort()メソッド を使用します。例えば登録日時の降順であれば、下記のようにします。sortの第2引数を省略した場合は昇順となります。昇順でも降順でも、対象のカラムがNULLのレコードは最後となります。それらを先頭に持ってきたい場合は第3引数に文字列 "first" を渡してください。
$users = finder("User")->sort("added", "desc")->fetchAll();
取得する件数を指定したりする場合、limit()メソッド・offset()メソッドを使用します。例えば10件目から30件目まで取得するのであれば、下記のようにします。
$users = finder("User")->limit(20)->offset(10)->fetchAll();
20, 30もカラムを持つテーブルの場合、必要なカラムだけを指定した方がパフォーマンスに優れます。finder関数の第2引数、またはpメソッドで指定することができます。
$users = finder("User", array("name"))->sort("added", "desc")->fetchAll();
$users = finder("User")->p(array("name"))->sort("added", "desc")->fetchAll();
行数を知りたい場合はfetchAllの代わりに count()メソッド を使用してください。
$rowCount = finder("User")->eq("status", 1)->ge("age", 30)->ends("email", "@example.com")->count();
echo $rowCount;
戻り値をモデルの配列ではなく単に配列で受け取りたい場合、fetchArray()メソッド を使用します。この時、配列のキーはプライマリキーの値となります。
$rows = finder("User")->eq("age", 30)->fetchArray();
foreach ($rows as $id => $row) {
echo $id . ": " . $row["name"];
}
fetchArray()メソッド にはカラム名を1つ渡すことができ、その場合は単純な連想配列として返されます。
$rows = finder("User")->eq("age", 30)->fetchArray("name");
foreach ($rows as $id => $name) {
echo $id . ": " . $name;
}
関連項目