テーブルクラスの作成
データベースの準備が整ったので、これにアクセスするためのテーブルクラスを作成します。
値の設定が必要な変数
Zend_Db_Table_Abstract
を継承したクラスを作るにあたり、いくつか値の設定が必要な変数があるので表にまとめます。ここであげる変数の可視性はすべてprotectedです。
変数名 | 内容 | 備考 |
$_schema | テーブルが含まれるデータベース名の文字列 | $_nameをデータベース名.テーブル名の形で指定すれば省略可能 |
$_name | テーブル名の文字列 | クラス名とテーブル名が同一の場合は省略可能 |
$_primary | 主キーの列名の文字列(主キーが単一の列の場合)または、主キーの列名の配列(主キーが複合キーの場合) | 省略不可 |
$_dependentTables | 参照元テーブルクラス名の文字列の配列 | 参照元テーブルがない場合、DBMSの参照整合性制約による操作を利用する場合は指定しない |
$_referenceMap | 外部キーの参照先テーブルの情報を格納した配列 | 詳細は後述 |
$_sequence | 主キーの自動インクリメントの指定 | DBMSの自動インクリメントを使う場合はtrue、DBMSのシーケンスオブジェクトを使う場合はオブジェクト名 |
これを踏まえて、テーブルクラスを作成していきます。
テーブルクラスのコーディング
では、実際にテーブルクラスのコーディングを行います。基本となる部分は抽象クラスZend_Db_Table_Abstract
に含まれているので、テーブル固有の部分のみをコードに記述することになります。
作成するテーブルクラスのクラス名はテーブル名と同一で、単語の複数形を頭文字のみ大文字にしたものにしています。
外部キーを持たないテーブルのクラス作成
まずは外部キーを持っていないテーブルのクラスを作ります。OfficesテーブルとMembersテーブルがこれにあたります。
<?php
require_once 'Zend/Db/Table.php';
// officesテーブルに対応するクラスを定義します
// Zend_DbのZend_Db_Table_Abstract
クラスを継承します
class Offices extends Zend_Db_Table_Abstract {
// テーブルを含むデータベース名を指定します
protected $_schema = 'db_zend_sample';
// 主キーの列名を指定します
protected $_primary = 'office_id';
// 参照元テーブルを指定します
protected $_dependentTables = array('Rooms');
}
protectedのメンバ変数を3個記述しただけですが、必要最小限のテーブルクラスはこれで完成です。クラス名はテーブル名と同じOfficesなので、メンバ変数$_name
は省略しています。テーブルOfficesを外部キーで参照しているテーブルはRoomsがあるので、メンバ変数$_dependentTables
でこれを指定します。
Members
クラスも同様のコードになります。
<?php require_once 'Zend/Db/Table.php'; // Membersテーブルに対応するクラスを定義します class Members extends Zend_Db_Table_Abstract { // テーブルを含むデータベース名を指定します protected $_schema = 'db_zend_sample'; // 主キーの列名を指定します protected $_primary = 'member_id'; // 参照元テーブルを指定します protected $_dependentTables = array('Permissions'); }
外部キーを持つテーブルクラス作成
外部キーで他のテーブルを参照しているテーブルのクラスでは、メンバ変数$_referenceMap
の値を設定する必要があります。$_referenceMap
には外部キー情報を連想配列で格納します。キーは任意です。外部キー情報も連想配列で、次の表の内容を格納します。
キー | 内容 |
columns | 外部キーの列名の文字列(外部キーが単一の列の場合)、または外部キーの列名の文字列の配列(外部キーが複合キーの場合) |
refTableClass | 参照先のテーブルクラス名の文字列 |
refColumns | 外部キーの参照先列名の文字列(外部キーが単一の列の場合)、または参照先列名の文字列の配列(外部キーが複合キーの場合、順序はcolumnsと一致すること) |
onDelete | 参照先レコードが削除された場合の動作の指定 |
onUpdate | 参照先レコードが更新された場合の動作の指定 |
ここで指定するonDeleteとonUpdateは、DBMSが参照整合性制約をサポートしていない場合に同様の動作をZend_Dbに行わせるためのものです。'cascade'またはself::CASCADEを指定すると、参照先レコードの削除または変更に連鎖して削除・変更を行います。
SQLのCREATE TABLE文で、外部キーのオプションにON DELETE CASCADEまたはON UPDATE CASCADEを指定したのと同様の動作になります。参照整合性制約の動作が必要で、かつDBMSがこれをサポートしていない場合のみこれを指定します。DBMS側で参照整合性制約を設定している場合にテーブルクラス側でonDelete
、onUpdate
を設定してはいけません。onDelete
、onUpdate
の指定がない場合は連鎖した削除・変更を行いません。
// 外部キー情報の設定例を抜粋して示します
protected $_referenceMap =
array('ref_office' =>
array(// 自テーブルのoffice_id列が外部キーです
'columns' => 'office_id',
//Offices
クラスに対応するテーブルを参照します
'refTableClass' => 'Offices',
// 参照先の列名はoffice_idです
'refColumns' => 'office_id',
// 参照先レコードが削除されると連鎖して削除を行います
'onDelete' => 'cascade',
// 参照先レコードが変更されると連鎖して変更を行います
'onUpdate' => self::CASCADE));
では、実際のソースコードです。外部キーを持っているRoomsテーブルのクラスを作成します。
<?php require_once 'Zend/Db/Table.php'; // Roomsテーブルに対応するクラスを定義します class Rooms extends Zend_Db_Table_Abstract { // テーブルを含むデータベース名を指定します protected $_schema = 'db_zend_sample'; // 主キーの列名を指定します protected $_primary = 'room_id'; // 参照先テーブルを指定します protected $_referenceMap = array('ref_office' => array('columns' => 'office_id', 'refTableClass' => 'Offices', 'refColumns' => 'office_id')); }
Roomsテーブルが持つ外部キーは1つだけでOfficesテーブルを参照しています。この外部キーの情報を$_referenceMap
に格納します。キーは'ref_office'としました。
この例では参照整合性制約を利用しないため、外部キー情報の中にonDelete
とonUpdate
の指定は含めていません。