在 Zend Framework 的 9.8. Zend_Db_Table Relationships 章节中,介绍了使用 Zend_Db_Table 关联表的例子。我听过不少人都觉得这部分相当难理解。我觉得手册如果能给出例子中所用数据表的E-R图,那么能帮助大家更清晰的理解这个例子。
E-R 图:
建表用 SQL 语句 (MYSQL 5.0):
—
— 表的结构 `accounts`
—
CREATE TABLE `accounts` (
`account_name` varchar(50) NOT NULL,
PRIMARY KEY (`account_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
—
— 表的结构 `bugs`
—
CREATE TABLE `bugs` (
`bug_id` varchar(50) NOT NULL,
`reported_by` varchar(50) NOT NULL,
`assigned_to` varchar(50) NOT NULL,
`verified_by` varchar(50) NOT NULL,
PRIMARY KEY (`bug_id`),
KEY `reported_by` (`reported_by`),
KEY `assigned_to` (`assigned_to`),
KEY `verified_by` (`verified_by`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
—
— 表的结构 `bugs_products`
—
CREATE TABLE `bugs_products` (
`bug_id` varchar(50) NOT NULL,
`product_id` varchar(50) NOT NULL,
PRIMARY KEY (`bug_id`,`product_id`),
KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
—
— 表的结构 `products`
—
CREATE TABLE `products` (
`product_id` varchar(50) NOT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
—
— 限制表 `bugs`
—
ALTER TABLE `bugs`
ADD CONSTRAINT `bugs_ibfk_3` FOREIGN KEY (`verified_by`) REFERENCES `accounts` (`account_name`),
ADD CONSTRAINT `bugs_ibfk_1` FOREIGN KEY (`reported_by`) REFERENCES `accounts` (`account_name`),
ADD CONSTRAINT `bugs_ibfk_2` FOREIGN KEY (`assigned_to`) REFERENCES `accounts` (`account_name`);
—
— 限制表 `bugs_products`
—
ALTER TABLE `bugs_products`
ADD CONSTRAINT `bugs_products_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`),
ADD CONSTRAINT `bugs_products_ibfk_1` FOREIGN KEY (`bug_id`) REFERENCES `bugs` (`bug_id`);
例子中的代码:
class Accounts extends Zend_Db_Table_Abstract
{
protected $_name = 'accounts'; // 物理表名
protected $_dependentTables = array('Bugs'); // 与之关联的表,当前表作为父表
}
class Products extends Zend_Db_Table_Abstract
{
protected $_name = ‘products’; // 物理表名
protected $_dependentTables = array(‘BugsProducts’); // 与之关联的表,当前表作为父表
}
class Bugs extends Zend_Db_Table_Abstract
{
protected $_name = ‘bugs’;
// 物理表名
protected $_dependentTables = array('BugsProducts');
// 与之关联的表,当前表作为父表
protected $_referenceMap = array(
'Reporter' => array(
'columns' => 'reported_by', // 外键
'refTableClass' => 'Accounts', // 外键引用的表
'refColumns' => 'account_name' // 外键引用的表的主键
),
'Engineer' => array(
'columns' => 'assigned_to',
// 外键
'refTableClass' => 'Accounts',
// 外键引用的表
'refColumns' => 'account_name'
// 外键引用的表的主键
),
'Verifier' => array(
'columns' => array('verified_by'),
// 外键
'refTableClass' => 'Accounts',
// 外键引用的表
'refColumns' => array('account_name')
// 外键引用的表的主键
),
'Product' => array(
'columns' => array('product_id'),
// 外键
'refTableClass' => 'Products',
// 外键引用的表
'refColumns' => array('product_id')
// 外键引用的表的主键
)
);
}
class BugsProducts extends Zend_Db_Table_Abstract
{
protected $_name = ‘bugs_products’;
// 物理表名
protected $_referenceMap = array(
'Bug' => array(
'columns' => array('bug_id'),
// 外键
'refTableClass' => 'Bugs',
// 外键引用的表
'refColumns' => array('bug_id')
// 外键引用的表的主键
),
'Product' => array(
'columns' => array('product_id'),
// 外键
'refTableClass' => 'Products',
// 外键引用的表
'refColumns' => array('product_id')
// 外键引用的表的主键
)
);
}
Leave a Reply