数据表关联是指两个或者多个数据表的记录之间的逻辑关系。
例如:
目前,fleaphp 支持四种类型的数据表关联,分别是:
在 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', ) );}?>
在详细介绍这四种关联之前,先了解一些后文将会用到的术语。
理解这几个术语后,我们再来看每一种关联的详细解释。
has_one 是一种非常简单的关联关系。表示一个记录拥有另一个记录。这两个记录分别位于两个数据表中。
在一个信息管理系统中,users 表用于存储用户帐户的基本信息,例如用户名、密码等。而 profiles 表则用于存储用户的个人信息,例如家庭住址、邮政编码等。
由于每一个用户(一条 users 表中的记录)都有一份对应的个人信息(一条 profiles 表中的记录)。因此,我们就可以为 users 表定义一个 has_one 关联。
很明显,users 表的记录拥有一条 profiles 表的记录。因此,当 users 表中的一条记录被删除时,被删除记录所拥有的 profiles 表中的关联记录也会被自动删除。
在 has_one 关联中,要求外键放置在关联表中。
上述例子的表定义简化版如下:
users 表:
profiles 表:
对应的 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 则指定在主表的查询结果中用什么字段映射关联表的数据。
新闻热点
疑难解答