SlideShare une entreprise Scribd logo
1  sur  23
Doctrineを元にした Zend_Db_Tableの拡張 2010.03.06 paperboy&co.  桶谷 幸平
はじめに 本資料中のサンプルコードは以下のDBテーブルを対象にしたものです。 category job category_id name created_at updated_at job_id category_id company url position location email 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 = “okeya@paperboy.co.jp”;      $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

Contenu connexe

Tendances

Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの] Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
norry_gogo
 
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623
Miho Ishida
 
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようWordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
Naoki Matsuda
 

Tendances (19)

Drupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込むDrupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込む
 
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの] Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
 
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
 
PHP classの教室
PHP classの教室PHP classの教室
PHP classの教室
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
Ci tutorial
Ci tutorialCi tutorial
Ci tutorial
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623
 
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
 
Web技術勉強会 第25回
Web技術勉強会 第25回Web技術勉強会 第25回
Web技術勉強会 第25回
 
PHP foreachでの参照渡しに潜む罠
PHP foreachでの参照渡しに潜む罠PHP foreachでの参照渡しに潜む罠
PHP foreachでの参照渡しに潜む罠
 
Currying in perl
Currying in perlCurrying in perl
Currying in perl
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
これからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしようこれからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしよう
 
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えようWordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
 
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
 

Similaire à Zend Db Table拡張説明資料

Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
龍一 田中
 
脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_Query脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_Query
Hidekazu Ishikawa
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
guest5f4320
 
XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3
Hikawa Kilica
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
 

Similaire à Zend Db Table拡張説明資料 (20)

Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_Query脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_Query
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
第4回Magento Cafe Plus〜Rewriteと独自テーブル
第4回Magento Cafe Plus〜Rewriteと独自テーブル第4回Magento Cafe Plus〜Rewriteと独自テーブル
第4回Magento Cafe Plus〜Rewriteと独自テーブル
 
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニックWordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
 
XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3XOOPS Cube Conference 2012 Developer Workshop 3
XOOPS Cube Conference 2012 Developer Workshop 3
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
Project lambda
Project lambdaProject lambda
Project lambda
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
Rails Controller Fundamentals
Rails Controller FundamentalsRails Controller Fundamentals
Rails Controller Fundamentals
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 

Zend Db Table拡張説明資料