Japan | ボルボ・カー・ジャパンサイズ: 全長1,408×幅889×高さ260(クローズ時)、515(拡張時)mm 容量 : 500ℓ(拡張時) 重量 : 17.1kg
Zend Db Table拡張説明資料
-
Upload
co-hey-japan -
Category
Technology
-
view
3.999 -
download
0
Transcript of Zend Db Table拡張説明資料
はじめに
本資料中のサンプルコードは以下のDBテーブルを対象にしたものです。
job
job_id
category_id
company
url
position
location
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_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";
}