相変わらず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 件のコメント:
コメントを投稿