仓酷云
标题:
PHP网站制作之FleaPHP 开辟指南 - 7. 数据表联系关系
[打印本页]
作者:
飘飘悠悠
时间:
2015-2-4 00:11
标题:
PHP网站制作之FleaPHP 开辟指南 - 7. 数据表联系关系
不过还好,PHP语言给出的语法错误很详细,只要稍微熟悉一点之后,看错误提示就能很容易找出错误所在的。PHP还有一个特别好用的调试功能,在PHP语句中,你可以随时用echo来输出结果。开辟指南|数据 数据表联系关系是指两个或多个数据表的纪录之间的逻辑关系。
例如:
每个国民都有一个身份证号码
每位作者都写了多本(0-n)书本,而每本书本都有多个(1-n)作者
每篇文章都有多个(0-n)评论
每个评论都属于一篇文章
今朝,FleaPHP 撑持四品种型的数据表联系关系,分离是:
HAS_ONE:
以后表的每笔记录都具有最多一条(0C1)联系关系纪录
HAS_MANY:
以后表的每笔记录都具有多条(0-n)联系关系纪录
MANY_TO_MANY:
以后表的每笔记录都和其他表的多条(0-n)纪录联系关系
BELONGS_TO:
以后表的每笔记录都属于另外一个表的某笔记录
在 FleaPHP 中,可觉得每个表数据进口界说多个分歧的联系关系,例如:
<?phpload_class('FLEA_Db_TableDataGateway');class Model_ProductClass extends FLEA_Db_TableDataGateway{ var $tableName = 'product_class'; var $primaryKey = 'pclass_id'; var $hasMany = array( array( 'tableClass' => 'Model_Permissions', 'foreignKey' => 'pclass_id', 'mappingName' => 'permissions', ), array( 'tableClass' => 'Model_Products', 'foreignKey' => 'pclass_id', 'mappingName' => 'products', 'enabled' => false, ), ); var $hasOne = array( array( 'tableClass' => 'Model_ProductClassAdverts', 'foreignKey' => 'pclass_id', 'mappingName' => 'advert', ) );}?>
复制代码
术语
在具体引见这四种联系关系之前,先懂得一些后文将会用到的术语。
联系关系:
一个联系关系是一个关系,这个关系属于某一个数据表。例如 users 表能够就具有一个或多个联系关系。
主表:
关于一个联系关系,具有该联系关系的数据表就是主表。例如 posts 表界说了一个 MANY_TO_MANY 联系关系。那末在这里(指这个联系关系),posts 就是主表。
联系关系表:
在一个联系关系中,联系关系表就是除主表外的另外一个表。
外键:
在数据库道理中,外键的寄义很庞杂。但在 FleaPHP 框架中的数据库联系关系功效中,外键泛指一个纪录顶用于联系关系另外一个纪录的字段。例如 profile 表中的 user_id 字段就是用于联系关系 users 表的字段。这个 user_id 字段就是一个外键。
两头表:
在 MANY_TO_MANY 联系关系中,除主表和联系关系表,还需求另外一个表来保留这两个表的纪录之间的相互联系关系关系。这个表称为两头表。
了解这几个术语后,咱们再来看每种联系关系的具体注释。
HAS_ONE 一对一联系关系
HAS_ONE 是一种十分复杂的联系关系关系。暗示一个纪录具有另外一个纪录。这两个纪录分离位于两个数据表中。
示例
在一个信息办理体系中,users 表用于存储用户帐户的根基信息,例如用户名、暗码等。而 profiles 表则用于存储用户的团体信息,例如家庭住址、邮政编码等。
因为每个用户(一条 users 表中的纪录)都有一份对应的团体信息(一条 profiles 表中的纪录)。因而,咱们就能够为 users 表界说一个 HAS_ONE 联系关系。
很分明,users 表的纪录
具有
一条 profiles 表的纪录。因而,当 users 表中的一笔记录被删除时,被删除纪录所具有的 profiles 表中的联系关系纪录也会被主动删除。
表界说
在 HAS_ONE 联系关系中,请求外键放置在联系关系表中。
上述例子的表界说简化版以下:
users 表:
user_id 主键字段
username
profiles 表:
profile_id 主键字段
address
postcode
user_id
外键字段
对应的 MySQL 代码以下:
CREATE TABLE `users` ( `user_id` INT NOT NULL AUTO_INCREMENT , `username` VARCHAR( 32 ) NOT NULL , PRIMARY KEY ( `user_id` ));CREATE TABLE `profiles` ( `profile_id` INT NOT NULL AUTO_INCREMENT , `address` VARCHAR( 128 ) NOT NULL , `postcode` VARCHAR( 8 ) NOT NULL , `user_id` INT NOT NULL , PRIMARY KEY ( `profile_id` ));
复制代码
对应的 FLEA_Db_TableDataGateway 承继类的界说以下:
<?phpload_class('FLEA_Db_TableDataGateway');class Users extends FLEA_Db_TableDataGateway{ var $tableName = 'users'; var $primaryKey = 'user_id'; var $hasOne = array( 'tableClass' => 'Profiles', 'foreignKey' => 'user_id', 'mappingName' => 'profile', );}class Profiles extends FLEA_Db_TableDataGateway{ var $tableName = 'profiles'; var $primaryKey = 'profile_id';}?>
复制代码
演示代码
<?php// 起首拔出一条 users 纪录$modelUsers =& new Users();$newUserId = $modelUsers->create( array('username' => 'dualface'));// 接上去,再拔出一条 profiles 纪录$modelProfiles =& new Profiles();$modelProfiles->create( array( 'address' => 'SiChuan ZiGong', 'postcode' => '643000', 'user_id' => $newUserId ));// OK,咱们如今测验考试读取一条 users 纪录,看看会失掉甚么了局$user = $modelUsers->find($newUserId);dump($user);?>
复制代码
了局很风趣,多出来的 ‘profile’ 字段正好是咱们方才拔出 profiles 表的纪录内容:
Array( [user_id] => 1 [username] => dualface [ref___id] => 1 [profile] => Array ( [profile_id] => 1 [address] => SiChuan ZiGong [postcode] => 643000 [user_id] => 1 [ref___id] => 1 ))
复制代码
申明
在下面的例子中,
Users
类中有一个 $hasOne 成员变量。该变量为一个数组:
var $hasOne = array( 'tableClass' => 'Profiles', 'foreignKey' => 'user_id', 'mappingName' => 'profile',);
复制代码
$hasOne 成员变量用于为一个表数据库进口指定 HAS_ONE 联系关系。
登录/注册后可看大图
在联系关系的界说中,
tableClass
指定联系关系表的表数据进口类称号,
foreignKey
指定外键字段名,而
mappingName
则指定在主表的查询了局顶用甚么字段映照联系关系表的数据。
在相册系统的开发上,因为采用的是团队分工合作方式,更让我明白了在一个团队之中,团队成员之间的交流沟通的重要性,如果没有很好的沟通交流,成员之间的任务没有分配好。
作者:
柔情似水
时间:
2015-2-4 09:54
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者:
简单生活
时间:
2015-2-5 13:39
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者:
只想知道
时间:
2015-2-6 02:25
本文当是我的笔记啦,遇到的问题随时填充
作者:
若天明
时间:
2015-2-8 14:00
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者:
第二个灵魂
时间:
2015-2-24 04:43
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者:
海妖
时间:
2015-3-7 10:54
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者:
莫相离
时间:
2015-3-9 21:51
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者:
变相怪杰
时间:
2015-3-17 02:02
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者:
admin
时间:
2015-3-19 02:08
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者:
不帅
时间:
2015-3-26 23:54
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者:
爱飞
时间:
2015-4-2 19:28
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者:
谁可相欹
时间:
2015-4-6 04:46
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者:
深爱那片海
时间:
2015-4-10 06:43
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者:
灵魂腐蚀
时间:
2015-4-10 09:29
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者:
仓酷云
时间:
2015-4-10 14:58
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者:
小女巫
时间:
2015-4-18 15:31
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者:
蒙在股里
时间:
2015-4-26 23:07
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者:
飘飘悠悠
时间:
2015-4-27 23:25
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者:
透明
时间:
2015-4-29 06:26
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者:
再见西城
时间:
2015-5-9 17:25
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2