zf 不只是在简单操作上很方便,在有关联的表的中,也一样的强大。
学习zend framework对规范PHP习惯,提升PHP水平有很大的帮助。
这是官方API的中文翻译:
Zend_Db_Table_Row 类有查询方法可以查询其他表中的相关数据记录。主要步骤如下:
1、定义表间关系
Zend_Db_Table_Abstract定义了$_dependentTables和$_referenceMap来表示表间关系。$_dependentTables表示依赖于本表的类名,它是一个数组,一个表可以有多个依赖表。如果要让Zend_Db_Table级联更新和删除的话,在父表中配置$_dependentTables,列出所有表的类名。注意,这里需要使用类名,而不是SQL实际的表名,包括$_referenceMap配置也是一样。$_dependentTables实例:
| protected $_dependentTables = array(‘Bugs’); |
$_referenceMap表示本表对其他表的依赖关系,它是一个数组,数组的每一个元素代表了一种映射关系,表示本表对其他一表的映射关系。该映射关系由映射名、本表引用字段、被引用表名、被引用字段。$_referenceMap实例:
| protected $_referenceMap = array(
‘Bug’ => array( //映射名 ‘columns’ => array(‘bug_id’), //本表引用字段 ‘refTableClass’ => ‘Bugs’,//被引用表名 ‘refColumns’ => array(‘bug_id’)//被引用字段 ) ) |
columns:用一个字符串或者数组表示的依赖表的外键。一般情况下,它是一个单独的字段,有些表也可能是多个字段。
refTableClass:父表的类名,而不是表名。
refColumns:父表中的主键,一般情况下,它也是一个字段,有的表可能有多个字段。
onDelete:父表中删除记录时的操作
onUpdate:父表中主键被修改时的操作
2、查询依赖记录
根据父表的查询结果的Row对象,可以查询得到依赖表中依赖于本记录的所有记录结果。方法如下:
| $row->findDependentRowset($table, [$rule]); |
该方法返回一个Zend_Db_Table_Rowset_Abstract对象。$table是对应表的类名,以字符串表示,也可以是该类的对象。[$rule]表示一种映射关系,它是一个可选变量。当不指定时,依赖表中的$_referenceMap第一个映射关系会被采用,否则就需要用其他的映射名来表示。例如:$bugsAssignedToUser = $user1234->findDependentRowset(‘Bugs’, ‘Engineer’);
Zend还提供了Zend_Db_Table_Select来限定依赖记录,而不是查询出所有的依赖记录。方法是
| $select= $accountsTable->select()->order(‘name ASC’)->limit(3);
findDependentRowset(‘Bugs’, ‘Engineer’, $select)。 |
Zend还提供了一种”magic method”的方式来调用findDependentRowset(‘<TableClass>’, ‘<Rule>’),其模式如下:
$row->find<TableClass>()
$row->find<TableClass>By<Rule>()
<TableClass>是表名字符串,<Rule>是依赖关系名,大小写必须一致。实例:
$user1234->findBugs();//调用默认的Rule查询依赖集
$user1234->findBugsByEngineer();//调用Engineer Rule查询依赖集
3、查询父表记录
查询父表中的被依赖记录方法:
| $row->findParentRow($table, [$rule]); |
父表中若只有一条记录,则返回Row对象,若有多条记录,则返回RowSet对象。各种参数说明见上面的讲解。
同样也有相应的”magic method”:
$row->findParent<TableClass>([Zend_Db_Table_Select $select])
$row->findParent<TableClass>By<Rule>([Zend_Db_Table_Select $select])
4、多对多关系(Many-to-many)
对于多对多的关系查询可以采用如下方法:
| $row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2, [Zend_Db_Table_Select $select]]]); |
同样也有相应的”magic method”:
$row->find<TableClass>Via<IntersectionTableClass> ([Zend_Db_Table_Select $select])
$row->find<TableClass>Via<IntersectionTableClass>By<Rule1> ([Zend_Db_Table_Select $select])
$row->find<TableClass>Via<IntersectionTableClass>By<Rule1>And<Rule2> ([Zend_Db_Table_Select $select])
通过以上方式可以得到父表或者子表的记录,但是并没有集成在同一条Row中。而转到前台显示的时候最好是同一条Row中。可以经过数组在存储,将两个RowSet或者Row变成一个数组。但是转换起来比较复杂,而且查询也较多。因此最好还是经过一条Sql查询出来。可以通过Zend_Db_Select直接查询。其方式如下:
| $db = Zend_Registry::get(‘db’);
$select = $db->select(); $select->from(‘news’, ‘*’); $select->join(‘column’, ‘news.col_id = column.id’, ‘*’); $select->where($where); //$select->limit(1,0); //通过以上语名建立起$select $rows = $db->fetchAll($select); |