查询文章信息时查询出文章相关的分类信息,其实文章表和分类表应该是属于多对一的关系。
接下来我们来看一对多查询的例子,请确保你已经参考实战(一)中的代码创建了相关的数据表结构,并插入了一定的测试数据;
在实战(一)中我们已经在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', ), ); }
修改models/Category.php,添加如下方法:
复制内容到剪贴板
PHP代码:
class Category extends Zend_Db_Table { protected $_name = 'categories'; protected $_primary = 'cat_id'; public function getArticlesById($cat_id) { $select = $this -> select() -> from('articles',array('id','cat_id','title')); $category = $this -> find($cat_id) -> current(); $articles = $category -> findDependentRowset('Article', 'category', $select) -> toArray(); $rowset = $category -> toArray(); $rowset['articles'] = $articles; return $rowset; } }
我们通过Zend_Db_Table_Row_Abstract提供的findDependentRowset()方法从文章表中关联查询出满足当前记录的数据集,该方法返回一个Zend_Db_Table_Rowset_Abstract对象,该方法有三个参数:
$dependentTable: 关联查询时所依赖表的类定义名(上面的示例中为Article);
$ruleKey:默认为null,通过$_referenceMap属性可以添加多个关联规则信息(应该也可以理解为是关联的名称),在这里指定是通过那个关联规则进行关联查询,如果没有指定,则默认使用$_referenceMap的第一个规则;
Zend_Db_Table_Select $select:默认为null,通过此参数我们可以对关联查询的结果进行一定的限制
OK,下面我们在任意控制器中实例化分类表的数据模型,比如在IndexController中:
复制内容到剪贴板
PHP代码:
class IndexController extends Zend_Controller_Action { public function init() { } public function indexAction() { $modelCategory = new Category(); //查询分类ID为2的所有文章信息 $articles = $modelCategory -> getArticlesById(2); Zend_Debug::dump($articles); } }
运行程序结果:
复制内容到剪贴板
PHP代码:
array(4) { ["cat_id"] => string(1) "2" ["parent_id"] => string(1) "0" ["name"] => string(6) "分类二" ["articles"] => array(2) { [0] => array(3) { ["id"] => string(1) "3" ["cat_id"] => string(1) "2" ["title"] => string(24) "这是一篇属于分类二的文章" } [1] => array(3) { ["id"] => string(1) "4" ["cat_id"] => string(1) "2" ["title"] => string(24) "这是一篇属于分类二的文章" } } }