So-net無料ブログ作成
検索選択

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)nametext
1hogeaaaaa
2foobbbbb
3nyogeabcde
4hogege[ null ]
5bar[ スペース ]

また、サンプルで登場する$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周りについての基本的な事は終了。
次回はリクエストについてやります。


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。

関連リンク

メッセージを送る

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。