連載
» 2007年03月05日 08時00分 公開

第2回 Zend Frameworkの各コンポーネントを一気に制する「Zend Framework」で加速するPHP開発(3/3 ページ)

[杉田直哉,ITmedia]
前のページへ 1|2|3       

Modelクラス:データベースアクセスやロジックを処理するモデル層を定義する

 Zend Frameworkでは、データベースアクセスの抽象レイヤーとなるZend_Dbを備えています。基本的にはPDOを中心としたアダプタで構成されていますが、DB2、Oracle、MySQLiはネイティブのドライバによって実装されています*

DBMSの切り替え

 Zend_Dbでは、factoryメソッドに渡すURLを変更することで、ドライバの種類を変更可能です。このURLの形式は、「PDO_MYSQL」のように「PDO_」を先頭につけることが推奨されています*(表1)

表1 表1 ドライバの種類を判別させるときに指定するURL

SQLクエリの発行方法

 現在のバージョンでは、例えば次のような選択肢があります。

  • Zend_Db_Adapterを使用して直接的にSQLクエリを発行する(リスト5)

 ほかのフレームワークでよくあるようなSQLの隠蔽効果はありませんが、シンプルで分かりやすいコードが記述できます。


<?php
require_once 'Zend/Db.php';
$params = array ('host' => '127.0.0.1', 'username' => 'malory', 'password' => '******', 'dbname' => 'camelot');
$db = Zend_Db::factory('PDO_MYSQL', $params);
$result = $db->query('SELECT * FROM example WHERE date > :placeholder', array('placeholder' => '2006-01-01'));
$rows = $result->fetchAll();
?>

リスト5 Zend_Db_Adapterを使用して直接的にSQLクエリを発行する
  • SQLクエリの発行を、内包されたZend_Db_Adapterの機能に委譲する(リスト6)

 Zend_Dbではドライバの抽象レイヤーが提供されているので、データベースにアクセスするAPIの違いを意識することなく、互換性の高いコードを記述可能です。ただし、データベースによっては発行するSQLに多少の差異が存在するので、SQLが記述されたアプリケーションを、互換性を意識せずに移行するのは難しいです。そのため、SQL文の生成をZend_Dbに委譲して、必要最低限の記述のみで済ませることもできます。


<?php
require_once 'Zend/Db.php';
$params = array ('host' => '127.0.0.1', 'username' => 'malory', 'password' => '******', 'dbname' => 'camelot');
$db = Zend_Db::factory('PDO_MYSQL', $params);
$select->from('round_table', '*')
       ->where('noble_title = :title')
       ->order('first_name')
       ->limit(10,20);
$params = array('title' => 'Sir');
$result = $db->fetchAll($select, $params);
?>

リスト6 SQLクエリの発行を、内包されたZend_Db_Adapterの機能に委譲する
  • Zend_Db_Tableを使用してO/Rマッピングを行う(リスト7)

 Zend_Db_Table は、Zend_Db_Tableクラスを継承したオブジェクトと、対応する表をマッピングするような仕組みを備えています。これによって、オブジェクト指向と親和性の高い記述が可能です。また、余計なコードを記述しなくても済むように、デフォルト値として規約が存在します。リスト7でいうと、「RoundTable」クラスはデータベースの「round_table」表とマッピングされます。また、主キーは「id」列として認識されます。ただし、次のように継承したクラスの変数を上書きして、任意の値をデフォルト値の代わりに使用することもできます。

<?

ass RoundTable extends Zend_Db_Table

 {

$this->_name = 'another_table_name';

$this->_primary = 'another_column_name';

}

?>



<?php
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$where = $db->quoteInto('noble_title = ?', 'Sir')
       . $db->quoteInto('AND first_name = ?', 'Robin');
$order = 'favorite_color';
$row = $table->fetchRow($where, $order);
?>

リスト7 Zend_Db_Tableを使用してO/Rマッピングを行う

おわりに

 以上、2回に渡ってZend Frameworkの機能と概要を解説しました。より詳細は、具体例を用いて今後解説していきます。また、Zend Frameworkのマニュアルでは、すぐに実行可能なサンプルコードを交えながらフレームワークの機能を解説しています。このマニュアルは、日本語を含む主要10か国語でリリースされており、英語が得意でない方にも始めやすいように配慮がなされています。ぜひチャレンジしてみてください。

 次回からは、Zend Frameworkで構築されたブログツールを題材にして、実際にZend Frameworkに備わる機能や使い方を解説していきたいと思います。

このページで出てきた専門用語

DB2、Oracle、MySQLiはネイティブのドライバによって実装されています

ただし、Zend_Dbが提供するAPIはPDOに依存しないため、使用する上で意識しなくて良いよう配慮されている。

「PDO_」を先頭につけることが推奨されています

この方法によるURL指定は、Preview 0.2から推奨されており、Preview 0.1.5では別の指定方法も可能。


本記事は、オープンソースマガジン2006年11月号「Zend Framework」で加速するPHP開発を再構成したものです。


著者紹介

日本アイ・ビー・エム システムズエンジニアリング株式会社

杉田直哉

日本アイ・ビー・エム システムズ・エンジニアリング株式会社(ISE)は、日本アイ・ビー・エムグループにおけるSE技術者の専門家集団として1992年7月に設立された。

発足以来、IBM製品を中心とした難易度の高い複雑なシステム構築や先進技術の適用場面において、卓越したITスキルによりお客様と開発現場を支援してきた。

近年は、仮想化技術・グリッドコンピューティング・Web 2.0・オープンソースソフトウェア等々の先進技術分野での支援も展開している。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ