在FleaPHP中,支持以下四种兌关系Q?br />
* HAS_ONE
* HAS_MANY
* MANY_TO_MANY
* BELONGS_TO
分别对应FLEA_Db_TableDataGateway表中?$hasOne,$hasMany,$manyToMany,$belongsTo 属?br />
我们下面q 老师Q学生,学生案Q班U的例子说说q几个关pR?br />
以下是SQL代码Q?br />
1 //学生?br />
2 Create TABLE `testDB`.`student` (
3 `stu_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
4 `stu_name` VARCHAR(20) NOT NULL,
5 `stu_class_id` INTEGER UNSIGNED NOT NULL,
6 PRIMARY KEY (`stu_id`)
7 )
8
9 //学生案?br />
10 Create TABLE `testDB`.`stu_record` (
11 `record_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
12 `stu_id` INTEGER UNSIGNED NOT NULL,
13 `family_add` VARCHAR(150) NULL,
14 `family_tel` VARCHAR(20) NULL,
15 PRIMARY KEY (`record_id`)
16 )
17
18 //教师?br />
19 Create TABLE `testDB`.`teacher` (
20 `teacher_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
21 `teacher_name` VARCHAR(20) NOT NULL,
22 PRIMARY KEY (`teacher_id`)
23 )
24
25 //班?br />
26 Create TABLE `testDB`.`classes` (
27 `class_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
28 `class_name` VARCHAR(20) NOT NULL,
29 PRIMARY KEY (`class_id`)
30 )
31
32 //׃教师与班U是多对多关p,所有徏立一个中间连接表以表C兌
33 Create TABLE `testDB`.`link_teacher_classes` (
34 `link_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
35 `teacher_id` INTEGER UNSIGNED NOT NULL,
36 `class_id` INTEGER UNSIGNED NOT NULL,
37 PRIMARY KEY (`link_id`)
38 )
现在Q徏好表之后Q我们还要写几个l承自FLEA_Db_TableDataGateway父类的类Q以对应数据库中的StudentQTeacherQClasses表(q接表不用了Q如下:
1 //学生表对应的c?/span>
2 class Model_Student extends FLEA_Db_TableDataGateway{
3 var $tableName = 'student';
4 var $primaryKey = 'stu_id';
5
6 /*
7 q是一对一关系Q一个学生对应唯一的一个Record案
8 tableClass 对应要与之关联一对一的表的对象类Q即案表的c?br />
9 foreignKey是在案表中Q对应学生表的一个外键接q字D,
10 用该字段标识该档案属于哪个学?br />
11 mappingName 是用于在你查询学生信息Ӟ学生档案字段的别?br />
12 */
13 var $hasOne = array(
14 'tableClass' => 'Model_Record',
15 'foreignKey' => 'stu_id',
16 'mappingName' => 'record'
17 );
18 /*
19 q是从属关系Q一个学生属于某一个班U,换过来说是班与学生一对多Q?br />
20 一个班U有多个学生Q而学生就只属于一个班U?br />
21 tableClass 指定该类要与之有从属关系的类Q这里是班c?br />
22 foreignKey q里指定的是该表里的q接外表的字D,q里是学生表的班UID字段
23 注意Q这里的foreignKey指的是本表的字段Q而上面hasOne关系中的foreignKey
24 指的是外表中的字D,要注意区分清?br />
25 mappingNameq里׃多说了,跟上面的一P也是用于昄区分的别?br />
26 */
27 var $belongsTo = array(
28 array(
29 'tableClass' => 'Model_Classes',
30 'foreignKey' => 'stu_class_id',
31 'mappingName' => 'class'
32 )
33 );
34 }
35
36 //案表对应的c?/span>
37 class Model_Record extends FLEA_Db_TableDataGateway{
38 var $tableName = 'stu_record';
39 var $primaryKey = 'record_id';
40 }
41
42 //教师表对应的c?/span>
43 class Model_Teacher extends FLEA_Db_TableDataGateway{
44 var $tableName = 'teacher';
45 var $primaryKey = 'teacher_id';
46
47 /*
48 q里立了教师与班的多对多关系Q一个教师可以教多个班
49 而一个班U也有多个教?br />
50 tableClass 指定要徏立多对多关系的表的类
51 joinTable q个属性要注意一个,q个是指定教师表与班U表关系的连接表
52 ׃二维表的数据l构的原因,所以多对多关系要用一个中间表Q即q接表)来表C?br />
53 q接表中指明两个表各自的主键ID可以了Q以两个字段作复合主键,如不用复?br />
54 主键Q就新增加一个字D作主键也可Q这没关p?br />
55 */
56 var $manyToMany = array(
57 array(
58 'tableClass' => 'Model_Classes',
59 'mappingName' => 'class',
60 'joinTable' => 'link_teacher_classes',
61 )
62 );
63 }
64
65 class Model_Classes extends FLEA_Db_TableDataGateway{
66 var $tableName = 'classes';
67 var $primaryKey = 'class_id';
68
69 /*
70 q里立了班U与学生的一对多关系
71 tableClass 指定该表的类要与哪个表的cd立一对多关系
72 foreignKey 外键IDQ这里即指定学生表中定义的班UIDQ这个是外表的字D?br />
73 */
74 var $hasMany = array(
75 array(
76 'tableClass' => 'Model_Student',
77 'foreignKey' => 'stu_class_id',
78 'mappingName' => 'students'
79 )
80 );
81
82 var $manyToMany = array(
83 // ׃多对多关pL双向的,所以班U表也可以定义上与教师表的多对多关系
84 // 也可以不写,看需求而定Q比如你x看某个班U信息时Q一q显C?br />
85 // 有多个任课老师的话Q那在q个班c里加上关系Q我q里׃写了。。?/span>
86 );
87 }
以上的代码就建立好了关系了,现在只管使用是了?br />
不过q提醒大家一点,在每个关p里Q都有一?‘enabled’ 的属性,如果讄?false的话Q则是将该关pȝ掉,所以查询出来的l果没有该关系的相应数据,q样可以节省效率Q按需要时才打开相应的关联,该属性默认ؓtrue 可以如下讄Q?br />
1 array(
2 'tableClass' => 'Model_Student',
3 'foreignKey' => 'stu_class_id',
4 'mappingName' => 'students',
5 ‘enabled’ => false
6 )
现在我们来测试一下数据。(事先自行插入几行数据用以试Q?br />
1 $classManager = FLEA::getSingleton('Model_Classes');
2 $class =& $classManager->find(array('class_id' => 1));
3 dump($class);
出现l果如下Q?br />

q个例子已含盖了q四个关联关pȝ基本用法了,其它的就׃们来探烦了,不久后,我将会发表一下这此关联方面的高应用Q有旉的话会写写这斚w的东ѝ敬h待!

]]>