- 浏览: 197050 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
guji528:
使用Python通过正则表达式替换很方便:
sprin ...
Python正则表达式指南 -
guji528:
很实用,先keep再看
Python正则表达式指南 -
yushine:
1,2,3,5 已经做了剩下的本来也正准备做。
2012, 每一个软件工程师必须做的11件事 -
mynetstudy:
用导出不就可以了吗
递归删除SVN工作目录下的.svn目录
介绍:
在RDBMS中,表之间有着各种关系,有一多对应,多多对应等等。
Zend框架提供了一些方法来方便我们实现这些关系。
定义关系:
下面是本文用的例子的关系定义:
<?php 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') ) ); } 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') ) ); }
我们看到例子中定义了四个类:Accounts,Products,Bugs,BugsProducts。其中Accounts,Products和Bugs是三个实体表,而BugsProducts是关系表。
我们再来分析一下这三个实体,一个Account有多个Bug,他们之间是一对多的关系,而Bug和Product是多对多的关系。
$_dependentTables是一个与该对象关联的对象名,这里注意,要写对象名而不是关联的数据库名。
$_referenceMap
数组用来定义和其他表的关系,在这里可以设置和那些表有关系,有什么样的关系。第一个设置的是Rule Key,也就是上面例子的'Reporter',
'Engineer'之类的。Rule
Key的作用其实就是一个关系的名字,并不需要和其他数据库表名或者其他对象名的名字一样。只是为了标记的,在后面的时候,我们可以看到这个Rule
Key的作用。
每一个Rule下面都有如下的一些定义:(没有特殊说明,都以如上'Reporter'关系进行说明)
- columns=> 设置和别的表关联的字段名,如上的'report_by'就是数据库中表Bugs的report_by字段。这里只有一个字段,也可以设置多个字段。
- refTableClass=>用于设置与这个表发生关系的表。这里要注意,一定使用目标表的对象的名字而不是表名字,例子中就和'Account'对象发生了关联。
- refColumns =>设置发生联系的表的字段。可以写多个,如果和多个字段发生联系的话,这里要和columns对应。这个设置其实是可选的,如果为空,关联字段自动被设置成为关联表的主键。上面例子中并没有使用主键作为关联字段,所以手动设置。
- onDelete=>可选字段,设置当删除是的动作。
- onUpdate=>可选字段,设置当更新表时的动作。
以上定义关系。
从关联表中取数据:
如果我们已经得到了一个查询结果,我们可以通过一下语句去取得这个结果相关联的表的查询结果
$row->findDependentRowset($table, [$rule]);
这个方法一般使用与一多对应的两个实体表中,在多多对应的两个实体表和一个关系表如何从一个实体表取出另一个实体表的数据,我们会在下面叙述。
第一个字段
$table
是指和这个表想相联系的表对应的类名。第二个字段是可选的,是我们刚刚说到的
rule key
,就是这个关系的名字,如果省略,则默认为这个表中的第一个关系。下面是例子:
?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsReportedByUser = $user1234->findDependentRowset('Bugs');
例子中,我们先读取了一个编号为1234的用户,然后去查找这个家伙报了什么bug,由于zend默认是第一个关联,所以这里和Account发生关联的第一个就是'Reporter,所以就取出了Reporter的记录。
如果我们想取出其他的记录,比如Engineer,可以按照下面的办法:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsAssignedToUser = $user1234->findDependentRowset('Bugs', 'Engineer');
除了使用findDependentRowset之外,我们还可以使用叫做“魔术方法”(Magic Method)的机制。之所以这么叫,就是因为好像是在变魔术一样。所以方法findDependentRowset('<TableClass>', '<Rule>')就可以等价于如下:
- $row->find<TableClass>()
- $row->find<TableClass>By<Rule>()
注:这个机制是我们最一开始是在Ruby on Rails里面看到的。这里的<TableClass>和<Rule>一定要使用和相关联的类名以及关联名(Rule Key)完全一样的名字,才可以生效。下面是例子:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); // Use the default reference rule $bugsReportedBy = $user1234->findBugs(); // Specify the reference rule $bugsAssignedTo = $user1234->findBugsByEngineer();
从父表取得字段:
刚刚我们介绍了一多关系中的从一去多的方法,现在我们反过来,从多取一,其实是从多中的一个取他相对应的那个记录。
类似的我们有这样的语句:
$row->findParentRow($table, [$rule]);
类似的,$table为类名,而可选参数$rule填入对应的Rule Key。下面是例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW')); $bug1 = $bugsRowset->current(); $reporter = $bug1->findParentRow('Accounts');
和上面不太一样的是,上面返回的是一个多个记录的集合,而这次返回的必然是一条记录。下面的例子是设置Rule:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); $engineer = $bug1->findParentRow('Accounts', 'Engineer');
只需要吧Rule填入就好了。相似的,这个方法也有“魔术字段”。findParentRow('<TableClass>', '<Rule>')对应:
- $row->findParent<TableClass>()
- $row->findParent<TableClass>By<Rule>()
例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); // Use the default reference rule $reporter = $bug1->findParentAccounts(); // Specify the reference rule $engineer = $bug1->findParentAccountsByEngineer();
取得多对多关系表的字段:
上面两个方法讲述了一对多的使用,下面就是多对多了。我们使用如下方法取得多对多关系表的数据:
$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);
这里参数变成了4个,因为需要增加一个关系表来存储多对多的关系。
$table是与之发生多对多关系的表的类名,$intersectionTable是中间存储关系的关系表的类名。$rule1和$rule2是上面两个数据表的Rule Key。省略Rule Key的例子如下:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts');
下面是该方法的全部参数调用例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts', 'Bug');
这次的“魔术方法”是,对应 findManyToManyRowset('<TableClass>', '<IntersectionTableClass>', '<Rule1>', '<Rule2>')
- $row->find<TableClass>Via<IntersectionTableClass>()
- $row->find<TableClass>Via<IntersectionTableClass>By<Rule1>()
- $row->find<TableClass>Via<IntersectionTableClass>By<Rule1>And<Rule2>()
例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); // Use the default reference rule $products = $bug1234->findProductsViaBugsProducts(); // Specify the reference rule $products = $bug1234->findProductsViaBugsProductsByBug();
发表评论
-
Magento模板及布局文件中引用Static Block的方法
2013-03-21 10:25 1258Static Block是Magento提供的非常实用的一种 ... -
PHP ORM框架与简单代码实现
2013-02-18 12:37 1395对象关系映射(Object Relational Mappi ... -
php.ini安全配置详细解释
2013-01-24 11:28 1897PHP本身再老版本有一些问题,比如在 php4.3.10和p ... -
关于PHP学习
2012-11-02 21:54 7911.首先看了PHP的源码API ... -
浅谈Zend Framework, CodeIgniter与Kohana
2012-04-13 17:11 1178抛砖引玉,这三份框架 我都花了一定的时间精力去了解,根据 ... -
浅谈Zend Framework, CodeIgniter与Kohana
2012-04-13 17:10 14<div id="article_conten ... -
22个开源的PHP框架
2012-02-06 12:40 943http://coolshell.cn/articles/10 ... -
isolated 十个超级有用的PHP代码片段
2012-01-31 15:50 8741. 发送短信 调用 TextMagic API。 // ... -
Drupal 主页定制:定制个性的drupal 主页<front>
2011-11-24 23:48 1030默认主题就是列表格式,像blog一样,一般做企业展示性的网站, ... -
drupal6.x中创建新的主题模版和区域(Regions)
2011-11-24 23:27 15542011-01-02 18:29 ... -
9大最有潜力PHP开源项目:PHP FOR Android开发居首
2011-11-10 11:21 1500PHP的开源世界可谓相当 ... -
Comparing PHP Frameworks ( Symfony, CakePHP, YII and CodeIgniter)
2011-06-30 18:13 1524转自 http://karim-ouda.blogspot.c ... -
A Good PHPer
2011-01-18 16:35 7301.首先看了PHP的源码API函数,对于许多口水仗的争论一笑而 ... -
PHP实现html标签补全
2011-01-18 15:37 1144PHP实现html标签补全 作者:朦朧中的罪惡 | ... -
Comparison of web application frameworks
2011-01-18 15:29 990From Wikipedia, the free encycl ... -
搭建Eclipse PDT开发CakePHP的环境
2011-01-14 14:20 2638搭建Eclipse PDT开发CakePHP ... -
Developing custom PHP extensions PECL Tutorials 从源程序编译 DLL
2011-01-04 17:34 1766想了很久怎么给这篇文 ... -
国外主流PHP框架比较-CodeIgniter、CakePHP、ZendFramework、Symfony
2010-12-01 13:16 1212最近简单的使用了目前在国内用的比较多的几个主流国外PHP框架( ... -
面向 PHP 5.3 友好的 PHP 开发
2010-10-12 13:57 1177最近 Debian 的 testing 版 ... -
php5.3不支持eregi()函数了
2010-10-12 13:52 8634写正则的时候可能会碰到用ereg()时出现错误,如:Depre ...
相关推荐
ZendFramework-1.11.10-manual-zh.zip
ZendFramework-1.10.4
ZendFramework 1.12.9 代码和文档.rar
花了半个小时编译的文档,作为api手册很不错的.
ZendFramework-1.5.1-manual-zh手册
ZendFramework-1.11.5中文文档;网页版。
Zend Framework 是由 Zend 公司支持开发的完全基于PHP5 的开源PHP开发框架,可用于开发 Web 程序和服务,采用 MVC(Model-View-Controller) 架构模式来分离应用程序中不同的部分方便程序的开发和维护。
PHP开源框架Zend Framework
Zend类是整个Zend Framework的基类,之所以有这个类是为了使Zend Framework遵循DRY原则(Don't Repeat Yourself)。这个类只包含静态方法,这些类方法具有Zend Framework中的很多组件都需要的功能。 (Zend类是个功能...
Zend类是整个Zend Framework的基类,之所以有这个类是为了使Zend Framework遵循DRY原则(Don't Repeat Yourself)。这个类只包含静态方法,这些类方法具有Zend Framework中的很多组件都需要的功能。 (Zend类是个功能...
PHP顶级框架Zend Framework开发实战 源代码
Zend类是整个Zend Framework的基类,之所以有这个类是为了使Zend Framework遵循DRY原则(Don't Repeat Yourself)。这个类只包含静态方法,这些类方法具有Zend Framework中的很多组件都需要的功能。 (Zend类是个功能...
using-zend-framework-3-open-free-source-book,是帮助学习zend-framework-3的非常有用的文档,文档为英文
Developing-Php-Zend-Framework-Oracle-Core.pdf
ZendOptimizer-3.3.3-Windows-i386(PHP加速) ZendOptimizer-3.3.3-Windows-i386(PHP加速) ZendOptimizer-3.3.3-Windows-i386(PHP加速)
zend-framework-3-cookbook.pdf ,zf3简要教程,帮助zf3学习者
Table of Contents •Introduction to Zend Framework •Overview •Installation •Learning Zend Framework •Zend Framework Quick Start •Autoloading in Zend Framework •Plugins in Zend Framework •...
从framework.zend.com官方下载的帮助,英文,CHM 2008-03-24
ZendOptimizer-3.3.3-Windows-i386
ZendOptimizer-3.2.2-Windows-i386