Zend Frameworkについて(DB編3) [Zend Framework]
前回の続きで、参照系(Select文)についてやります。
マニュアルでは5.3からです。
最初に今回参照するテーブルのデータについて。
「test」テーブル概要(作成用SQL)
CREATE TABLE 'test' ( 'id' TINYINT( 2 ) NOT NULL , 'name' VARCHAR( 20 ) NOT NULL , 'text' VARCHAR( 100 ) NULL , PRIMARY KEY ( `id` ) )
データ
| id(key) | name | text |
| 1 | hoge | aaaaa |
| 2 | foo | bbbbb |
| 3 | nyoge | abcde |
| 4 | hogege | [ null ] |
| 5 | bar | [ スペース ] |
また、サンプルで登場する$dbには、DB接続オブジェクトが設定されているとする。
以上の前提条件を踏まえて、参照系について説明します。
基本的な参照の仕方
Zend_Dbを使いSelect文を発行するためには、Zend_Db_Selectを使用します。
Zend_Db_Selectのインスタンスを生成するには、Zend_Db_Adapterの「Select」メソッドを使います。
生成したインスタンスは、Select文で使われるメソッドを持っているので、
それに設定する値を渡すことによりSelect文が作られます。
作られたSelect文は「__toString()」メソッドによりSQLを取得する事ができます。
また、「fetchAll」メソッドなど行の取得メソッドにインスタンスを渡すことにより、
結果を直接受け取る事が出来ます。
超絶簡単サンプル1
簡単なSelect文の実行
$select = $db->select(); $select->from('test', '*'); $select->where('id IN(?)', 'array(1,3)'); $sql = $select->__toString(); $result = $db->fetchAll($sql);
このサンプルの結果、以下の情報が取得されます。
array( [0]=>array(['id']=>1, ['name']=>'hoge', ['text']=>'aaaaa'), [1]=>array(['id']=>3, ['name']=>'nyoge', ['text']=>'abcde') )
各メソッドの詳しいメソッドはこのあとやるとして、全体的な流れはこのようになります。
「from」メソッド
「from」メソッドでは、Select文で取得する項目と参照するテーブルを指定します。
$select = $db->select();
$select->from('bbb', 'aaa');
このように「from」メソッドに設定すると$selectインスタンスの中で、下記のSQL文が作らます。
SELECT aaa FROM bbb
また、複数のテーブルを参照したい場合は、「from」メソッドを連続して実施します。
$select = $db->select();
$select->from('test1', 'aaa');
$select->from('test2', 'bbb');
結果、以下のSQL文が作成されます。
SELECT aaa,bbb FROM test1,test2
もちろんテーブルや項目に別名を振る事も可能です。
$select = $db->select();
$select->from('test1 as t1', 't1.aaa');
$select->from('test2 as t2', 't2.bbb');
結果、以下のSQL文が作成されます。
SELECT t1.aaa,t2.bbb FROM test1 as t1,test2 as t2
テーブルをJOINさせたい場合には、「join」メソッドを使用します。
使い方は「from」メソッドとさほど違いはありませんが、テーブル名とカラム名の間に接続条件を指定します。
$select = $db->select();
$select->from('test1', '*');
$select->join('test2', 'test1.id = test2.id', '*');
結果、以下のSQL文が作成されます。
SELECT *, * FROM test1 JOIN test2 ON test1.id = test2.id
「where」メソッド
「where」メソッドでは、Select文で指定するwhere条件を指定します。
$select = $db->select();
$select->from('test', '*');
$select->where('test', '*');
このように「where」メソッドに設定すると$selectインスタンスの中で、下記のSQL文が作らます。
SELECT * FROM test WHERE id='1'
条件が複数ある場合、「where」メソッドを連続して使用するとAND条件、
「orWhere」メソッドを実行するとOR条件になります。
$select = $db->select();
$select->from('test', '*');
$select->where('name=?', 'hoge');
$select->where('id=?', 1);
$select->orWhere('id=?', 2);
このように「where」、「orWhere」メソッドに設定すると$selectインスタンスの中で、下記のSQL文が作らます。
SELECT * FROM test WHERE name='hoge' AND id='1' OR id='2'
また、「orWhere」メソッドは、先にwhere条件が指定されていない場合、
OR条件がつかないので、「where」メソッドと同じ使い方が出来ます。
なお、以下の様な「()」を利用した条件の設定は出来ません。
SELECT * FROM test WHERE name='hoge' AND (id='1' OR id='2')
現在のZend_Dbでは、このようなメソッドは提供されていないので、
「Zend/Db/Select.php」の「where」、「orWhere」メソッドを拡張、または機能を追加します。
例えば、やっつけ感が漂う以下の処理を「Select.php」に追加。
public function orWhere2($cond_arr) {
foreach($cond_arr as $cond) {
if ($this->_parts['where']) { $this->_parts['where'][] = "OR $cond)"; }
else { $this->_parts['where'][] = '('.$cond; }
}
return $this;
}
で、コントローラから呼び出してみると、
$select = $db->select();
$select->from('test', '*');
$select->orWhere2(array('id=1', 'id=2'));
下記のSQLが作成されます。
SELECT * FROM test WHERE (id=1 OR id=2)
出力制限
Zend_Dbでは、「limit」メソッドを使い件数とオフセットで絞り込んだり、
「limitPage」メソッドを使い出力するページを指定するなどの出力制御を行う事が出来ます。
サンプルとして、1ページに表示される件数を5件として、4ページ目を表示したい場合は、以下のように書きます。
$select = $db->select();
$select->from('test', '*');
$select->limitPage(4, 5);
その結果、(MySQLの場合は)下記のSQLが作られます。
SELECT * FROM test LIMIT 15, 5
ただし、出力制御を行うSQLはDBMSによって異なります。
この辺りはZend_Dbによってうまく吸収され同じ動作を行うようになっていますが、
詳しくはマニュアルの5.3.8、および5.3.9を参照して下さい。
ちなみに今回サンプルで行った方法だと、マニュアルと微妙に違う結果が返って着ているので、
やはり実際に動かす前に「__toString」メソッドでSQL文の確認をした方が無難だと思います。
他のメソッド
Zend_Dbでは、これまで挙げた物の他に、ORDER BY句の「order」メソッド、
GROUP BY句の「group」メソッド、HAVING条件の「having」メソッドが提供されています。
基本的な使い方は、これまでのメソッドと同様に指定したい値を渡し、
また条件を複数指定したい場合は、複数回実施します。
超絶簡単サンプル2
その他のメソッドの実行
$select = $db->select();
$select->from('test', 'name, text, count(*) as cnt');
$select->group('name');
$select->group('text');
$select->having('cnt>?', 2);
$select->order('name');
$sql = $select->__toString();
その結果、下記のSQLが返されます。
SELECT name, text, count(*) as cnt FROM test GROUP BY name, text HAVING cnt>'2' ORDER BY name ASC
いくつかポイントとして、
2回実施している「group」メソッドは、配列にして渡す事で1回にする事が可能です。
また、「having」メソッドは「where」メソッドと同様にクォーク処理が行われています。
「order」メソッドは並び順を指定しない場合は、デフォルトで昇順(ASC)が設定されます。
降順で表示したい場合は、明示的に'DESC'を付ける必要があります。
ここまででDB周りについての基本的な事は終了。
次回はリクエストについてやります。








コメント 0