我们通过四个数据表articles(文章表),categories(分类表),tags(标签表),articles_tags(文章_标签对应表)
来学习使用Zend_Db_Table Relationships关联查询
以下是创建这四个表的SQL语句:
复制内容到剪贴板
PHP代码:
-- --------------------------------------------------------
--
-- 表的结构 `articles`
--
CREATE TABLE IF NOT EXISTS `articles` (
`id` int(10) unsigned NOT NULL auto_increment,
`cat_id` tinyint(3) unsigned NOT NULL default '1',
`title` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- 表的结构 `articles_tags`
--
CREATE TABLE IF NOT EXISTS `articles_tags` (
`article_id` int(10) unsigned NOT NULL,
`tag_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`article_id`,`tag_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- 表的结构 `categories`
--
CREATE TABLE IF NOT EXISTS `categories` (
`cat_id` tinyint(3) unsigned NOT NULL auto_increment,
`parent_id` tinyint(3) unsigned NOT NULL default '0',
`name` varchar(50) NOT NULL,
PRIMARY KEY (`cat_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- 表的结构 `tags`
--
CREATE TABLE IF NOT EXISTS `tags` (
`tag_id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`tag_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
同时我们在文章表和分类表中插入一些测试数据
复制内容到剪贴板
PHP代码:
INSERT INTO `categories` (`cat_id`, `parent_id`, `name`) VALUES
(1, 0, '分类一'),
(2, 0, '分类二');
INSERT INTO `articles` (`id`, `cat_id`, `title`) VALUES
(1, 1, '这是一篇属于分类一的文章'),
(2, 1, '这是一篇属于分类一的文章'),
(3, 2, '这是一篇属于分类二的文章'),
(4, 2, '这是一篇属于分类二的文章');
下面分别定义文章模型文件(Article.php)和分类模型文件(Category.php):
models/Article.php
复制内容到剪贴板
PHP代码:
class Article extends Zend_Db_Table {
protected $_name = 'articles';
protected $_primary = 'id';
}
models/Category.php
复制内容到剪贴板
PHP代码:
class Category extends Zend_Db_Table {
protected $_name = 'categories';
protected $_primary = 'cat_id';
}
我们通过Zend_Db_Table的$_referenceMap属性来定义数据表的关联关系
models/Article.php
复制内容到剪贴板
PHP代码:
class Article extends Zend_Db_Table {
protected $_name = 'articles';
protected $_primary = 'id';
protected $_referenceMap = array(
'category' => array( //关联名称
'columns' => 'cat_id',
'refTableClass' => 'Category',
'refColumns' => 'cat_id',
),
);
}
$_referenceMap 的相关属性说明:
columns:指定当前数据表通过那个字段和外表关联,一般指外键(PK)
refTableClass:关联表所对应的类名称
refColumns:关联表使用那个字段和其它表关联,一般指主键(FK)
现在我们已经将文章数据表和分类数据表关联起来了,下面我们看来如何在查询某一篇文章的同时查询出相关的分类信息,
修改modles/Article.php,添加下面方法:
复制内容到剪贴板
PHP代码:
public function getById($id)
{
$where = $this -> select() -> where('id = ?', $id);
$article = $this -> fetchRow($where);
$select = $this-> select() -> from('categories', array('name'));
$category = $article -> findParentRow('Category', null, $select) -> toArray();
$row = $article -> toArray();
$row['category'] = $category;
return $row;
}
然后在任意controller里,比如IndexController.php里
复制内容到剪贴板
PHP代码:
class IndexController extends Zend_Controller_Action {
public function init()
{
}
public function indexAction()
{
$modelArticle = new Article();
$article = $modelArticle -> getById(3);
Zend_Debug::dump($article);
}
}
运行程序结果
复制内容到剪贴板
PHP代码:
array(4) {
["id"] => string(1) "3"
["cat_id"] => string(1) "2"
["title"] => string(24) "这是一篇属于分类二的文章"
["category"] => array(1) {
["name"] => string(6) "分类二"
}
}