Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
在一对一关联中,DyhbFrame提供了几乎全部的Model拥有的功能,在理解了Model的基础知识后,很轻易就可以使用DyhbFrame relationship带来的关联功能了。
首先看例子,我们先准备了两个数据表,分别是用户表及用户详细资料表,为了方便讲述
,这里的数据表都是简化的。
user 用户表
user_id int 用户ID 自增/主键
user_name varchar(50) 用户名 唯一
user_detail 用户详细资料表
user_id int 用户ID 主键
intro varchar(255) 用户个人介绍
一个用户记录对应着一个详细资料,因而这两个表是一对一的。正如前文所述,由于详细资料在逻辑上并非经常和用户表同时出现,所以我们将本来是相关的记录拆分成两个表来对待。(下面我们称user为本表,user_detail为对应表)
第二步,我们分别建立了这两个表的Model继承类,代码如下:
class UserModel extends Model
{
// 由Model的变量$_linker来设置表间关联
var $_linker = array(
array(
'type' => '1', // 关联类型,这里是一对一关联
'map' => 'detail', // 关联的标识
'mapkey' => 'user_id', // 本表与对应表关联的字段名
'fclass' => 'user_detail', // 对应表的类名
'fkey' => 'user_id', // 对应表中关联的字段名
'enabled' => true // 启用关联
)
);
}
我们看到,作为主表的user类,它使用了$_linker来设置关联信息(本章的最后将详细介绍$linker的每个设置的作用)。
下面我们来介绍一对一关联的add,del,find,findall操作:
CREATE
首先,一般而言如果我们调用了user类的create方法,将在user表中新增一条记录。不过现在我们希望通过使用了一对一的关联,同时地将记录新增到主表和对应表上:$newrow = array(
'user_name' => "灰太狼",
'detail' => array( // 请注意这里对应的就是$linker的'map' => 'detail',也就是关联的标识
'intro' => "草原上的王者" // 这里是增加到对应表上的数据
),
);
$userObj = M("user");
$userObj->relation(TRUE)->ADD($newrow); // 和普通的ADD不同!
好了,看看两个数据表,数据已经如我们想象一样出现了:
user表
1 灰太狼
user_detail表
1 草原上的王者
在使用$_linker过程中,需要注意的地方如上面注释的,一个是关联的标识的作用,另一个是relation(TRUE)->形式的函数调用。
$userObj->relation(TRUE)->add($newrow)这种形式的调用在DyhbFrame框架中的连贯操作,这将为我们的系统开发效率带来非常明显的改善。
del
一对一的关联中,删除操作是会将两表的对应记录同时删除。
$conditions = array('user_name' => "灰太狼"); // 还是要设置对主表的条件
$userObj = M("user");
$userObj->relation(TRUE)->del($conditions); // 完成删除
find/findall
我们并没有把find和findall放到前面去讲述,这是因为我们希望能够先了解数据从何而来,再去熟悉数据的使用。
在$_linker的作用下,拥有表间关联的find和findall,查找获取的结果都将带上关联表中的内容。
首先我们准备下面的表数据:
user表
1 灰太狼
2 小羊羊
user_detail表
1 不像草原上的王者
2 是一只羊
然后我们用find查找
$conditions = array("user_name"=>"小羊羊");
$userObj = M("user");
$result = $userObj->relation(TRUE)->find($conditions);
print_r($result);
结果是:
Array
(
[user_id] => 2
[user_name] => 小羊羊
[detail] => Array
(
[user_id] => 2
[intro] => 是一只羊
)
)
我们看到detail的标识已经带上了对应表user_detail的记录了。
使用findall查找
$userObj = M("user");
$result = $userObj->relation(TRUE)->findall();
print_r($result);
结果是:
Array
(
[0] => Array
(
[user_id] => 12
[user_name] => 灰太狼
[detail] => Array
(
[user_id] => 12
[intro] => 不像草原上的王者
)
)
[1] => Array
(
[user_id] => 14
[user_name] => 小羊羊
[detail] => Array
(
[user_id] => 14
[intro] => 是一只羊
)
)
)
主表和对应表的记录都能查找出来了。
以上,我们已经了解了$_linker的使用以及一对一关联的实例,接下来的教程中我们还将介绍一对多关联和多对多关联的用法。
在这里,我们还需要介绍一下$_linker的全部属性,部分是上面已经介绍过的
。
一、对本表内容而言
type,关联类型,只能取值"1","2"和"3"三者之一。
enabled,取值TRUE/FALSE,指示是否开启本关联
map,关联标识,在返回的结果里面标识关联内容的键值。
mapkey,本表中与对应表关联的字段名
二、对对应表内容而言
fclass,对应表的Model继承类名称
fkey,对应表中与本表关联的字段名
三、在多对多情况中,还有
midclass,中间表的Model继承类名称
四、对关联结果的限制
condition,对关联的附加条件,格式和findall一样
countonly,取值TRUE/FALSE,在关联查找时是否只返回关联结果的记录数量,而并不返回全部结果。
sort',返回关联结果的排序,格式和findall一样
field,返回关联结果的限定字段,格式和findall一样
limit,返回关联结果的数量,格式和findall一样
完整的 $_linker 应该是:protected $_Linker = array(
array(
'type' => '3',
'map' => 'ulink',
'mapkey' => 'user_id',
'fclass' => 'gb',
'fkey' => 'user_id',
'midclass' => 'user2gb',
'sort' => '', 'condition' => '', 'field' => '',
'belongs_to'=>FALSE,
'limit' => '',
'enabled' => true,
//'count' => 'the_count'
),
array(
...
)
);
