Zend Framework 多表关联

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);

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>