Zend Db Table拡張説明資料

23
Doctrineを元にした Zend_Db_Tableの拡張 2010.03.06 paperboy&co. 桶谷 幸平

Transcript of Zend Db Table拡張説明資料

Doctrineを元にしたZend_Db_Tableの拡張

2010.03.06

paperboy&co. 桶谷 幸平

はじめに

本資料中のサンプルコードは以下のDBテーブルを対象にしたものです。

job

job_id

category_id

company

url

position

location

email

created_at

updated_at

category

category_id

name

created_at

updated_at

また、ZendFrameworkは 1.10.0を利用し、appnamespaseはHoge、ディレクトリ構造は以下のようになっていますapplication/models

models/mappers

models/DbTable

Zend_Db_Tableを拡張した理由

■Doctrineの使い勝手を調査して、使い方を知る機会があった

■社内にてZendFrameworkの使い方を説明した際に覚えることが多いという意見をもらったこと

これより、Zend_Db_Tableを拡張することで、利用する際に覚えることを少なくし、より直観的に使えるようにできると考えました。

Doctrineを調査した結果

■ 便利だと思ったこと

recordクラスをnew して設定するだけで、insertできる(TableクラスからcreateNew()しなくていい。1レコードを扱う際に意識するのはレコードクラスのみ。)

$category = new Category();

$category->name = “hogehoge”;

$cateopry->save();

Doctrineを調査した結果

■ 便利だと思ったこと

SQL文から取得した結果を、更新可能なobject(Doctrine_Collection)として取得できる。(Zendはleft join などの条件をつけた結果は、arrayでしか取得できない)

$query = Doctine_Query::create()

->from(„Catetory c‟)

->leftJoin(„c.Job j‟);

->where(„j.location = ?‟, „shibuya‟);

$categories = $query->execute();

$categories->Job[0] = „zinnan‟;

$categories->save();

Doctrineを調査した結果

■ 便利だと思ったこと

findByカラム名(„カラム値‟)で、レコードクラスを取得できる

$table = Doctrine::getTable(„Category‟);

$categories = $table->findByName(„hogehoge‟);

Doctrineを調査した結果

■ 不便だと思ったこと

テーブルのリレーションを使って、他テーブルを取得する際に、細かく条件を設定できない

$table = Doctrine::getTable(„Category‟);

$category = $table->findOneByName(„hogehoge‟);

$cateogry->Job;

category_idでつながっている全てがとれる

Doctrineを調査した結果

■ 不便だと思ったこと

- クラスを自動生成するために、テーブル名とクラス名の関係に制限が発生する

(”_”が省略される等)

- 上記のことを含めてyamlの生成が大変

- Doctine特有の癖が強い

Zend_Db_Tableに持ち込んだ考え方

■Row、Rowsetクラスを生成した時点で処理対象テーブルが特定できる

(テーブル毎にRow、Rowsetクラスを定義します)

■1レコードを扱い際に意識するクラスは1つ(Rowクラスのみ)

■複雑なクエリ(left joinを含む)で取得したデータを、Rowsetとして扱うことができる

拡張した機能

■Zend_Db_Table

findByカラム名(„カラム値‟)で、Rowsetクラスを返す

$table = new Hoge_Model_DbTable_Category();

$categories = $table->findByName(„hogehoge‟);

($categories はHoge_Model_Mapper_Rowset_Category)

拡張した機能

■Zend_Db_Table

findOneByカラム名(„カラム値‟)で、Rowクラスを返す

$table = new Hoge_Model_DbTable_Category();

$category = $table->findOneByName(„hogehoge‟);

($cateogory はHoge_Model_Mapper_Row_Category)

拡張した機能

■Zend_Db_Table

defaultSourceをDEFAULT_DBに設定し、DBのdefault値を有効にする

拡張した機能

■Zend_Db_Table_Row

new された際に、テーブル定義されたdefault値を読み込む

$job = new Hoge_Model_Mapper_Row_Job();

$job->category_id = 1;

$job->email = “[email protected]”;

$job->save();

(処理で何も設定しなければ、default値が反映される)

拡張した機能

■Zend_Db_Table_Row

findByカラム名(„カラム値‟)で、取得したデータ1件のレコードオブジェクトとなる(データを内包する)

$job = new Hoge_Model_Mapper_Row_Job();

$job->findByCompany(„paperboy‟);

$job->url = “http://paperboy.co.jp‟;

$job->save();

拡張した機能

■Zend_Db_Table_Row

find(プライマリーキー値)で、取得したデータ1件のレコードオブジェクトとなる(データを内包する)

$job = new Hoge_Model_Mapper_Row_Job();

$job->find(2);

$job->location = “shinjuku”;

$job->save();

拡張した機能

■Zend_Db_Table_Row

assign(配列)で、配列キー名の変数に値を設定する($post値の設定などが楽)

$job = new Hoge_Model_Mapper_Row_Job();

$list = array(„category_id‟ => 1,

„company‟ => „papgeboy‟);

$job->assign($list);

$job->save();

拡張した機能

■Zend_Db_Table_Row

findテーブルクラス名Viaテーブルクラス名などの際に、“apppname_Model_DbTable_”等のnamespaceを省略できる

$category

= new Hoge_Model_Mapper_Row_Category();

$category->findByName(„hogehoge‟);

$jobs = $category->findJob();

通常はfindHoge_Model_DbTable_Job()

拡張した機能

■Zend_Db_Table_Rowset

new Rowsetクラス(array(„data‟ => $list))とすることで、$listのデータを更新可能なRowsetを生成できる($listの中に指定したテーブルのプライマリキーが重複する場合は間引く)

拡張した機能

■Zend_Db_Table_Rowset

$select = Zend_Db_Table::getDefaultAdapter()->select();

$select->from(array(„t1‟ => „category‟)

->joinLeft(array(„t2‟ => „job‟),

„t1.category_id = t2.category_id‟,

array())

->where(„t2.job_id is null‟);

$list = $select->query()->fetchAll();

$categories

= new Hoge_Model_Mapper_Rowset_Category(

array(„data‟ => $list));

$categories->deleteAll();

拡張した機能

■Zend_Db_Table_Rowset

- setAllカラム名(„カラム値‟)で、Rowsetの全Rowに値を設定できる

- saveAll()で、Rowsetの全Rowにsave()を実行できる- deleteAll()で、Rowsetの全てのRowを削除する

$category

= new Hoge_Model_Mapper_Row_Category();

$jobs = $category->find(2)->findJob();

$jobs->setAllLocation(„harajuku‟)->saveAll();

各クラスのソースコード

final class Hoge_Model_DbTable_Category

extends Pb_Db_Table_Abstract

{

protected $_name = "category";

protected $_primary = "category_id";

protected $_rowClass

= "Hoge_Model_Mapper_Row_Category";

protected $_rowsetClass

= "Hoge_Model_Mapper_Rowset_Category";

}

各クラスのソースコード

final class Hoge_Model_Mapper_Row_Category

extends Pb_Db_Table_Row_Abstract

{

protected $_tableClass

= "Hoge_Model_DbTable_Category";

}

final class Hoge_Model_Mapper_Rowset_Category

extends Pb_Db_Table_Rowset_Abstract

{

protected $_tableClass

= "Hoge_Model_DbTable_Category";

protected $_rowClass

= "Hoge_Model_Mapper_Row_Category";

}

各クラスのソースコード

http://github.com/co-hey