Home > Zend_Db > Zend_Db_Tableによるリレーションの実装

Zend_Db_Tableによるリレーションの実装

intro
Zend_Db_Tableを利用してリレーションを実装します。ソースコードはこちらからダウンロードできます。

1.bootstrap.phpとconfig.iniの作成
以下のようにapplication/bootstrap.phpファイルを作成します。

<?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以下を変更してください。

[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)。

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ファイルを作成します。

<?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ファイルを作成します。

<?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.コントローラの作成
以下のようにapplication/constorllers/IndexController.phpファイルを作成します。

<?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テーブルの行を取得しています。以下のように記述することもできます。

$user->findDependentRowset('Profiles')

また、Profilesテーブルの行からUsersテーブルの行を取得する場合は以下のように記述できます。

$profile->findParentUsers()
$profile->findParentUsersByAccount()
$profile->findParentRow('Users')
$profile->findParentRow('Users', 'Account')
4.ビューの作成
以下のようにapplication/views/scripts/index/index.phtmlファイルを作成します。

 
<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サーバにアクセスして親テーブルと子テーブルの情報が表示されることを確認してみてください。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://www.oplabo.jp/article/20/trackback
Listed below are links to weblogs that reference
Zend_Db_Tableによるリレーションの実装 from Open Programming Laboratory

Home > Zend_Db > Zend_Db_Tableによるリレーションの実装

English
Search
Feeds

Return to page top