DTOとDAOの形からmapperやactiverecordなどの方に移行してみたい…と、
勉強も兼ねて以下のサイト様を参考にMapper形式でPDO(表現おかしかったらすいません…)にて各種SELECT、INSERTなどを試してみました。
http://blog.tojiru.net/article/277021312.html
そこで疑問になったのですが、
クラスでテーブルのカラムをデータモデルという形で持ち、PDOにてそのクラスをFETCH_CLASSとすることで制作する、というところは理解できたのですが、
テーブルを結合する際はどのような設計になるのが一般的なのでしょうか?
最初は何も考えずテストとして、IDが紐付いているような簡単なもので試してみました際にエラーとなり、よくわからずだったのですが、
「PDO::FETCH_CLASS」を「PDO::FETCH_ASSOC」とすれば良いのだなと解決すると同時に通常は全JOINパターン分のモデルクラスを用意するのだろうか…と疑問になりました。
データベースの内容によってはものすごいことになるのでは…と思ったりしたのですが、通常はそれでも準備するものなのでしょうか?
同じテーブルでも取得したい場合によって、この場合はこっちとJOIN、この場合は…みたいになったりすると思っています。
すいません、記述不足でした為簡単にソースを記載させて頂きます。
(ほぼ、上記サイトでのサンプルそのままですが…)
PHP
1// mapperのクラス. 2 3abstract class DataMapper { 4 5 protected $_pdo; 6 7 function __construct( PDO $pdo ) { 8 $this->_pdo = $pdo; 9 } 10 11 protected function _decorate( PDOStatement $stmt ) { 12 $stmt->setFetchMode( PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, static::MODEL_CLASS ); 13 return $stmt; 14 } 15 16} 17 18class MemberMapper extends DataMapper { 19 20 const MODEL_CLASS = 'Member'; 21 22 function findAll() { 23 $stmt = $this->_pdo->query('SELECT * FROM `member`'); 24 return $this->_decorate($stmt); 25 } 26 27 function findAllJoin() { 28 $stmt = $this->_pdo->query('SELECT member.name as a, member_2.name as b FROM `member` LEFT JOIN `member_2` ON member.id = member_2.member_id'); 29 return $this->_decorate($stmt); 30 } 31 32} 33 34// PDO接続用関数. 35function fncGetPDO( $env = null ) { 36 37 static $pdo = array(); 38 39 if( !isset( $pdo[$env] ) ) { 40 41 $conf = array('dsn'=>'mysql:dbname=xxxxx;host=localhost;charset=utf8','user'=>'xxxxx','pass'=>'xxxxx'); 42 43 $pdo[$env] = new PDO( 44 $conf['dsn'], 45 $conf['user'], 46 $conf['pass'], 47 array( 48 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 49 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_CLASS, 50 ) 51 ); 52 53 } 54 55 return $pdo[$env]; 56 57} 58 59// …と別途テーブルのカラムに合わせたモデルクラスがあります。 60 61// 実行時. 62 63static $pdo; 64$pdo = fncGetPDO('local');// ここでのlocalは実際は条件分岐していますが、上記関数内に直接記載しました 65 66// こちらは問題無し. 67$member_mapper = new MemberMapper($pdo); 68$entries = $member_mapper->findAll()->fetchAll(); 69var_dump($entries); 70 71// こちらはエラー. 72$member_mapper = new MemberMapper($pdo); 73$entries = $member_mapper->findAllJoin()->fetchAll(); 74var_dump($entries);
ここでの問題は「FETCH_CLASS」としていることでモデルに含まれないものをJOINで取得しようとしているから、だと思った次第です。
(FETCH_ASSOCに書き換えることで実際に動作しました)
そこで、例えば結合するパターンのものを盛り込んでいく場合に一般的にはどのように構築していくものなのでしょうか…?
・PDO接続用関数をFETCH_CLASS用とFETCH_ASSOC用と2つ持つ?
・そもそもFETCH_CLASSを使わない?
…と、浅い考えに至ってしまった為、質問させて頂いております。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/04 07:18
2016/08/04 07:53
2016/08/05 07:34
2016/08/08 01:53