2009年7月31日金曜日

Zend_Db_Tableでリレーションの作成

どうも俺@仕事中です。
相変わらずZendFramework使っています。多分11月くらいまで。。。
今日はZend_Db_Tableでリレーション(テーブル間の関連)を表す方法をメモします。

サンプルDB(MySQL)として、スレッド型掲示板を作ります。
CREATE TABLE user (
 id INTEGER AUTO_INCREMENT PRIMARY KEY,
 name
);
CREATE TABLE thread (
 id INTEGER AUTO_INCREMENT PRIMARY KEY,
 user_id INTEGER,
body TEXT
);
CREATE TABLE reply (
 id INTEGER AUTO_INCREMENT PRIMARY KEY,
 user_id INTEGER,
 thread_id ITNEGER,
 body TEXT
);

リレーションは大まかに
user←thread←reply
という感じです。
replyテーブルはuser_idを持ちます。

この場合のZend_Db_Tableは
<?php
class User extends Zend_Db_Table {
 protected $_dependentTables = array(
    "Thread","Reply"); // ThreadクラスとReplyクラスに参照されている
}
class Thread extends Zend_Db_Table {
 protected $_dependentTables = array(
    "Reply"); // Replyクラスに参照されている
 protected $_referenceMap = array(
    "User" => array( // Userクラスを参照している(`Usre`は何でも可)
        "columns" => array("user_id"), // user_idが外部キー
        "refTableClass" => "User", // 参照先クラス名はUser
        "refColumns" => array("id"), // 参照先のキーはid
        "onDelete" => self::RESTRICT, // Userが削除されてもThreadは削除しない
        "onUpdate" => self::CASCADE // Userが更新されたらThreadmo更新する
        )
    );
}
class Reply extends Zend_Db_Table {
 protected $_referenceMap = array(
    "User" => array(
        "columns" => array("user_id"),
        "refTableClass" => "User",
        "refColumns" => array("id"),
        "onDelete" => self::RESTRICT,
        "onUpdate" => self::CASCADE
        ),
    "Thread" => array(
        "columns" => array("thread_id"),
        "refTableClass" => "Thread",
        "refColumns" => array("id"),
        "onDelete" => self::CASCADE,
        "onUpdate" => self::CASCADE
        )
    );
}

となります。
要は
protected $_dependentTables = array();
で参照してきているクラス名
protected $_referenceMap = array();
で参照しているクラス名
を記す事になります。

ではUserオブジェクトから参照されているThread(またはReply)を取得するには
<?php
$thread_rowset = $user->findDependentRowset("Thread");
または
$thread_rowset = $user->findThread();
となります。

Relpyオブジェクトから参照しているUser(またはThread)を取得するには
<?php
$user = $reply->findParentRow("User");
または
$user = $reply->findParentUser();
となります。

ん~、ZendFrameworkなかなかイイねー。

0 件のコメント: