intro
Zend_Db_Tableを利用してリレーションを実装します。ソースコードはこちらからダウンロードできます。
1.bootstrap.phpとconfig.iniの作成
以下のように
以下のように
環境に合わせて
この記事では以下のSQLを使用しました(MySQL)。
application/bootstrap.php
ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php set_include_path('../library' . PATH_SEPARATOR . get_include_path()); define('APP_BASE', '../application'); define('CONFIG_PATH', APP_BASE . '/config.ini'); require_once 'Zend/Controller/Front.php'; require_once 'Zend/Layout.php'; require_once 'Zend/Db.php'; require_once 'Zend/Config/Ini.php'; require_once 'Zend/Db/Table/Abstract.php'; $layout = Zend_Layout::startMvc(); //$layout->getView()->baseUrl = '/yourBaseUrl'; $config = new Zend_Config_Ini(CONFIG_PATH, 'staging'); $params = $config->database->params->toArray(); $params['options'][Zend_Db::CASE_FOLDING] = Zend_Db::CASE_LOWER; $dbAdapter = Zend_Db::factory($config->database->adapter, $params); Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter); Zend_Controller_Front::run(APP_BASE . '/controllers'); |
以下のように
application/config.ini
ファイルを作成します。環境に合わせて
database.params
以下を変更してください。
1 2 3 4 5 6 |
[staging] database.adapter = pdo_mysql database.params.host = localhost database.params.username = db_user database.params.password = db_password database.params.dbname = db_name |
この記事では以下のSQLを使用しました(MySQL)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
CREATE TABLE users ( id integer auto_increment NOT NULL PRIMARY KEY, username varchar(20) NOT NULL, password varchar(20) NOT NULL ); CREATE TABLE profiles ( id integer auto_increment NOT NULL PRIMARY KEY, user_id integer NOT NULL, first_name varchar(100) NOT NULL, last_name varchar(100) NOT NULL, email varchar(200) NOT NULL, url varchar(200) NOT NULL ); INSERT INTO users (username, password) values ('testuser', 'testpassword'); INSERT INTO profiles (user_id, first_name, last_name, email, url) values (1, 'Myfirstname', 'Mylastname', 'my@emailaddress', 'http://myurl/my/page'); |
2.モデルの作成
以下のように
上記の
次に以下のように
上記の
以下のルールを
application/models/Users.php
ファイルを作成します。
1 2 3 4 5 6 7 8 |
<?php require_once 'Zend/Db/Table/Abstract.php'; class Users extends Zend_Db_Table_Abstract { protected $_name = 'users'; protected $_dependentTables = array('Profiles'); } |
上記の
$_dependentTables
プロパティにUsersテーブルに依存するテーブルを記述します。次に以下のように
application/models/Profiles.php
ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php require_once 'Zend/Db/Table/Abstract.php'; class Profiles extends Zend_Db_Table_Abstract { protected $_name = 'profiles'; protected $_referenceMap = array( 'Account' => array( 'columns' => 'user_id', 'refTableClass' => 'Users', 'refColumns' => 'id' ) ); } |
上記の
$_referenceMap
プロパティにProfilesテーブルが参照するテーブルを記述します。以下のルールを
$_referenceMap
に記述できます。
ルール | 説明 |
---|---|
columns | 文字列または文字列の配列で、参照元の列名を指定します |
refTableClass | 参照するテーブル名を指定します |
refColumns | 文字列または文字列の配列で、参照先の列名を指定します |
onDelete | 親テーブルの行を削除した際の動作を指定します。 文字列 'cascade' またはself::CASCADE を指定すると関連する行が削除されます。デフォルトでは連鎖削除は行われません。 |
onUpdate | 親テーブルの行の主キーが更新された際の動作を指定します。 文字列 'cascade' またはself::CASCADE を指定すると参照元の列が更新されます。デフォルトでは連鎖更新は行われません。 |
3.コントローラの作成
以下のように
上記のうち
また、Profilesテーブルの行からUsersテーブルの行を取得する場合は以下のように記述できます。
application/constorllers/IndexController.php
ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php require_once 'Zend/Controller/Action.php'; require_once APP_BASE . '/models/Users.php'; require_once APP_BASE . '/models/Profiles.php'; class IndexController extends Zend_Controller_Action { protected $_user_id = 1; public function indexAction() { $users = new Users(); $user = $users->find($this->_user_id)->current(); if ($user) { $profile = $user->findProfiles()->current(); if ($profile) { $this->view->profile = $profile->toArray(); } $this->view->user = $user->toArray(); } } } |
上記のうち
$user->findProfiles()
でUsersテーブルの行からProfilesテーブルの行を取得しています。以下のように記述することもできます。
1 |
$user->findDependentRowset('Profiles') |
また、Profilesテーブルの行からUsersテーブルの行を取得する場合は以下のように記述できます。
1 2 3 4 |
$profile->findParentUsers() $profile->findParentUsersByAccount() $profile->findParentRow('Users') $profile->findParentRow('Users', 'Account') |
4.ビューの作成
以下のように
application/views/scripts/index/index.phtml
ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<h1><?= $this->translate('Table Relation Sample') ?></h1> <h2><?= $this->translate('Your User Account') ?></h2> <?php if (!$this->user) : ?> <span><?= $this->translate('No User Account Found') ?></span> <?php else : ?> <dl> <?php foreach($this->user as $key => $value) : ?> <dt><?= $this->translate($key) ?></dt> <dd><?= $this->escape($value) ?></dd> <?php endforeach; ?> </dl> <?php endif; ?> <h2><?= $this->translate('Your Profile') ?></h2> <?php if (!$this->profile) : ?> <span><?= $this->translate('No Profile Found') ?></span> <?php else : ?> <dl> <?php foreach($this->profile as $key => $value) : ?> <dt><?= $this->translate($key) ?></dt> <dd><?= $this->escape($value) ?></dd> <?php endforeach; ?> </dl> <?php endif; ?> |
5.確認
Webサーバにアクセスして親テーブルと子テーブルの情報が表示されることを確認してみてください。