Zend_Db_Tableによるデータベース接続

今まで、Zend_Dbでデータベース接続をしてきましたが、コントローラから簡単にアクセスできるので、これでも構わないのですが、やはりMVC指向のフレームワークを使いたいのなら、『モデル』も使いたいところです。ZendFrameworkでモデルに相当するのは、Zend_Db_Tableです。Zend_Db_Table内にアクセス処理を用意し、コントローラからはただメソッドを呼び出すだけにしたいと思います。

1) Zend_Db_Tableは、スーパークラスとなる『Zend_Db_Table_Abstract』クラスを継承し、新たなクラスを継承します。

class クラス名 extends Zend_Db_Table_Abstract{

2) クラスには、2つのメンバー変数を用意します。これは、テーブル名とプライマリーキーです。尚、プライマリーキー名が『id』なら、これは、省略することが出来ます。
protected $_name=テーブル名;
protected $_primary=プライマリーキー名;

3) 初期化及びセットアップのための処理を記述する『_setup』は必須メソッドです。

protected function _setup(){初期化処理}

4) では、実際にZend_Db_Tableを使って、データベースにアクセスしてみましょう。

5) 『zendapp』フォルダ内に、『models』フォルダを作成し、その中に『tables』というフォルダを作成します。

6) 作成した『tables』フォルダの中に、『Dvdcollections.php』というファイルを作成します。ここに、Zend_Db_Tableの記述をします。

7) まず、最初にZend_Db_Tableクラスをロードします。

require_once ‘Zend/Db/Table.php’;

8) あるいは、require_onceの代わりに、Zend_Loaderを使って、ロードしてもかまいません。

Zend_Loader::loadClass(‘Zend_Db_Table’);

9) 続いて、Zend_Db_Table_Abstractクラスを継承してクラスを作成します。

class Dvdcollections extends Zend_Db_Table_Abstract{ }

10) 2つのメンバー変数を指定します。テーブル名にdvd_collections、プライマリーキーにidを指定します。

ptotected $_name=’dvd_collections’;
protected $_primary=’id’; 

11) Zend_Db_Tableの初期化処理を行う_setupメソッドを作成します。

protected function _setrup(){}

12) データベースアクセスに必要な設定情報を配列で指定します。

$options=array(
 ‘host’=>’ホスト名’,//ローカルの場合は、localhost,
‘username’=>’ユーザー名’,
‘password’=>’パスワード’,
‘dbname’=>’データベース名’

13) そして、これを利用したアダプターを取得します。

$adapter=Zend_Db::factory(‘PDO_MySQL’,$options);

14) 最後に_setAdapterでアダプタークラスを設定します。これでZend_Db_Tableの初期化処理は終了します。

$this->_setAdapter($adapter);

15) 続いて、全てのテーブルを取得するメソッドsearchAllを作成します。

public function searchAll(){}

16) まず、Zend_Db_Selectインスタンスを取得します。Zend_Db_Tableには『select』メソッドが用意されていますので、$this->selectするだけで、Zend_Db_Selectを取得することが出来ます。また、Zend_Db_Tableでは、テーブルの指定はメンバー変数として用意されていますので、引数は何も指定する必要はありませんし、fromを呼び出す必要もありません。

$select=$this->select();

17) 続いて、全てのレコードを取得するためにfetchAllして、それをreturnします。このfetchAllはZend_Db_Tableから直接呼び出しますので、$this->fetchAllだけで大丈夫です。

$result=$this->fetchAll($select)
return $result;

18) このようにアダプタークラスにあった多くのメソッドがZend_Db_Tableには用意されていますので、Zend_Dbの使い方を覚えておけば、同じような感覚で使用することが出来ます。また、Zend_Db_Tableの方が、fromによるテーブルの指定などが不要ですので、より簡単に扱えるようになっています。

19) 曖昧検索用のメソッドorSearchも作成します。今までと同じようにタイトル名とコンテンツの内容で曖昧検索できるように作成します。親クラス(スーパークラス)のfetchAllを直接呼び出して使用してみました。$this->fetchAllでも同じです。

public function orSearch($search){
$select=$this->select()->where(“title like ‘%{$search}%'”)->orwhere(“content like ‘%{search}%'”);
$result= parent::fetchAll($select);
return $result;

20) 作成したDvdcollections.phpを下記に記述します。

<?php
//Zend_Db_tableをロードします。
Zend_Loader::loadClass('Zend_Db_Table');
class Dvdcollections extends Zend_Db_Table_Abstract{
 //メンバー変数を用意します。
 protected $_name='dvd_collections';
 protected $_primary='id';

 //初期化処理
 protected function _setup(){
 //データベース接続情報を配列で用意
 $options=array(
 'host'=>'localhost',
 'username'=>'root',
 'password'=>'1234',
 'dbname'=>'test_db'
 );
 $adapter=Zend_Db::factory('PDO_MySQL',$options);
 $this->_setAdapter($adapter);
 }
 //全データ取得のメソッド
 public function searchAll(){
 //データベースからレコードを取得する
 $select=$this->select();
 //return $this->fetchAll($select);
 $result=$this->fetchAll($select);
 return $result;
 }
 //曖昧検索用のメソッド
 public function orSearch($search){
 //データ検索
 $select=$this->select()->where("title like '%{$search}%'")->orwhere("content like '%{$search}%'");
 return parent::fetchAll($select);
 }
}

21) TestController.phpも修正します。まず最初に使用するライブラリ関係は、Zend_Loaderでロードするように変更しました。

Zend_Loader::loadClass(‘Zend_Controller_Action’);
Zend_Loader::loadClass(‘Zend_Config_Xml’);
Zend_Loader::loadClass(‘Zend_View’);
Zend_Loader::loadClass(‘Zend_Layout’);
Zend_Loader::loadClass(‘Zend_Exception’);
Zend_Loader::loadClass(‘Zend_Validate’);
Zend_Loader::loadClass(‘Zend_Filter’);
Zend_Loader::loadClass(‘Zend_Form’);
//Zend_From_Elementのロード
Zend_Loader::loadClass(‘Zend_Form_Element_Text’);
Zend_Loader::loadClass(‘Zend_Form_Element_Textarea’);
Zend_Loader::loadClass(‘Zend_Form_Element_Submit’);

22) モデルを読み込みます。

require_once APP_DIR.’/models/tables/Dvdcollections.php’;

23)  初期化メソッドの最後の方で、データベースに接続します。

$this->Dvdcollections=new Dvdcollections();

24) indexActionで、モデルを使ってデータベースから全レコードを取得します。

$result=$this->Dvdcollections->searchAll();

25) 検索用の処理を記述します。モデルで作成したorSearchメソッドを使って曖昧検索します。

if($this->getRequest()->isPost(){
$search=$this->getRequest()->getParam(‘search’);
$result=$this->Dvdcollections->orSearch($search); }

26) ビューへ連想配列で情報を渡します。

$this->view->assign(‘result’,$result);

27) それでは、修正した本日のTestController.phpを下記に表示します。

<?php
//定数の設定
define('APP_DIR', dirname(dirname(__FILE__)));
define('LAYOUT_DIR', APP_DIR.'/views/layouts');
//ライブラリ関係のロード
Zend_Loader::loadClass('Zend_Controller_Action');
Zend_Loader::loadClass('Zend_Config_Xml');
Zend_Loader::loadClass('Zend_View');
Zend_Loader::loadClass('Zend_Layout');
Zend_Loader::loadClass('Zend_Exception');
Zend_Loader::loadClass('Zend_Validate');
Zend_Loader::loadClass('Zend_Filter');
Zend_Loader::loadClass('Zend_Form');
//Zend_From_Elementのロード
Zend_Loader::loadClass('Zend_Form_Element_Text');
Zend_Loader::loadClass('Zend_Form_Element_Textarea');
Zend_Loader::loadClass('Zend_Form_Element_Submit');
//モデルの読み込み
require_once APP_DIR.'/models/tables/Dvdcollections.php';
class TestController extends Zend_Controller_Action{
 //初期化
 public function init(){
 //ヘッドタイトル情報をセットする
 $this->view->headTitle('Winrado徒然草');
 //連想配列による情報のセット
 $this->view->assign('sitename','WinRoad徒然草');
 $this->view->assign('description','ZendFrameworkの為のテストサイトです。');
 $this->view->assign('content_header','header.phtml');
 $this->view->assign('content_footer','footer.phtml');
 $this->view->assign('content_footer_text','copyright Winroad徒然草2011.');
 //Zend_layoutのためのオプションの指定
 $options=array(
 'layout'=>'layout',
 'layoutPath'=>LAYOUT_DIR,
 'content'=>'content');
 //Zend_layoutメソッドの開始
 $layout=Zend_Layout::startMvc($options);

 //データベースへの接続
 $this->Dvdcollections=new Dvdcollections();

 }
 public function indexAction(){
 //データベースからレコードを取得する
 $result=$this->Dvdcollections->searchAll();

 //POST送信された場合の処理
 if($this->getRequest()->isPost()){
 //受け取った値を変数に代入する
 $search=$this->getRequest()->getParam('search');
 //タイトルとコンテンツで曖昧検索する
 $result=$this->Dvdcollections->orSearch($search);
 }
 //連想配列データベース情報をセット
 $this->view->assign('result',$result);
 }
 public function createAddForm(){
 //Zend_Formをインスタンス化します。
 $form=new Zend_Form();
 //フォームの基本情報をセットします。
 $form->setMethod('post')->setAction('add');
 //フォームのコントロールを組み込みます
 $title=new Zend_Form_Element_Text('title');
 $title->setAttrib('size',40)
 ->setLabel('タイトル')
 ->setRequired(true)//必須項目の指定
 ->addValidator('StringLength',false,array(1,20))
 ->setErrorMessages(array(
 'notEmpty'=>"タイトル名を入力して下さい。",
 'StringLength'=>"'%value%'は1~20文字以内で記入して下さい。"
 ));
 $content=new Zend_Form_Element_Textarea('content');
 $content->setAttribs(array('cols'=>40,'rows'=>3))
 ->setLabel('コンテンツ')
 ->addFilter('StringTrim')
 ->setRequired(true)
 ->setErrorMessages(array(
 'notEmpty'=>"何か入力して下さい。"));
 $send=new Zend_Form_Element_Submit('send');
 $send->setLabel('新規追加');
 //コントローラの組込
 $form->addElement($title);
 $form->addElement($content);
 $form->addElement($send);

 return $form;
 }
 public function addAction(){
 $errors=array();
 $form=$this->createAddForm();
 $this->view->assign('form',$form);
 //POST送信されたら
 if($this->getRequest()->isPost()){
 //検証OKなら
 if($form->isValid($_POST)){
 $title=$this->getRequest()->getParam('title');
 $content=$this->getRequest()->getParam('content');
 //$content=Zend_Filter::get($content,'StripTags');
 $data = array(
 'title' =>$title,
 'content' =>$content
 );
 //データベースにレコードを挿入
 $this->db->insert('dvd_collections',$data);
 //indexにリダイレクトします
 $this->_redirect('test/index');
 }
 }
 }
 public function editAction()
 {
 //POSTデータが送信された場合の処理
 if($this->getRequest()->isPost()){
 //変数idに送信されたidを代入する
 $id=$this->getRequest()->getParam('id');
 //配列dataに送信されたデータを代入する
 $data=array(
 'title'=>$this->getRequest()->getParam('title'),
 'content'=>$this->getRequest()->getParam('content')
 );
 //idが一致するデータを更新する
 $this->db->update('dvd_collections',$data,"id={$id}");
 //indexにリダイレクトする
 $this->_redirect('test/index');
 //POSTデータが送信されていない場合の処理
 }else{
 $id=$this->getRequest()->getParam('id')*1;
 if($id <= 0){
 throw new Zend_Exception('レコードが見つかりません');
 }
 //Zend_Db_Select構文でidの一致するデータを取得します
 $select=$this->db->select()->from('dvd_collections')->where("id={$id}");
 //fetchRowメソッドで最初の1レコードを取得します。
 $result=$this->db->fetchRow($select);
 //ビューにデータを配列で渡します
 $this->view->assign('result',$result);
 }
 }
 public function delAction(){
 if($this->getRequest()->isPost()){
 $id=$this->getRequest()->getParam('id');
 $this->db->delete('dvd_collections',"id={$id}");
 $this->_redirect('test/index');

 }else{
 $id=$this->getRequest()->getParam('id')*1;
 if($id <= 0){
 throw new Zend_Exception('レコードのIDが見つかりません');
 }
 $select=$this->db->select()->from('dvd_collections')->where("id={$id}");
 $result=$this->db->fetchRow($select);
 $this->view->assign('result',$result);
 }
 }
}

とりあえずindexActionしか修正していませんが、本日は以上です。そのうちに残りのメソッドも修正したいと思います。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ