表的关联

 

HAS_ONE:      当前表的每一条记录都拥有最多一条(0–1)关联记录
HAS_MANY:     当前表的每一条记录都拥有多条(0-n)关联记录
MANY_TO_MANY: 当前表的每一条记录都和其他表的多条(0-n)记录关联
BELONGS_TO:   当前表的每一条记录都属于另一个表的某条记录

关联中必须设置的属性为:
‘name’,             // 关联的名字(如:hasOne、hasMany)
‘tableClass’,       // 关联的表数据入口对象名
‘mappingName’,      // 字段映射名

可选属性:
‘foreignKey’,       //外键字段名
’sort’,             //对关联表进行查询时使用的排序参数
‘conditions’,       //对关联表进行查询时使用的条件参数
‘fields’,           //对关联表进行查询时要获取的关联表字段
‘limit’,            //对关联表进行查询时限制查出的记录数
‘enabled’,          //是否处理关联,设置为falses时,不处理该表入口的任何关联。enabled 的优先级高于 linkRead、linkCreate、linkUpdate 和 linkRemove。
‘countOnly’,        //指示在查询关联表时是否仅仅统计记录数,而不实际查询数据
‘counterCache’,     //将关联记录总数缓存到指定的字段,数据表中要建立相应的字段
‘linkRead’,         //指示是否在主表读取记录时也读取该关联对应的关联表的记录,默认ture
‘linkCreate’,       //指示是否在主表创建记录时也创建该关联对应的关联表的记录,默认ture
‘linkUpdate’,       //指示是否在主表更新记录时也更新该关联对应的关联表的记录,默认ture
‘linkRemove’,       //指示是否在主表删除记录时也删除该关联对应的关联表的记录,默认ture
‘linkRemoveFillValue’, //当删除主表记录而不删除关联表记录时,用什么值填充关联表记录的外键字段,默认0
’saveAssocMethod’,      //指示当保存关联数据时,采用何种方法,默认为 save,可以设置为 create、update 或 replacevar $belongsTo = array(
       ‘tableClass’    => ‘Table_Users’,
       ‘mappingName’   => ‘author’,
       ‘foreignKey’    => ‘user_id’
);

var $hasOne = array(
        ‘tableClass’     => ‘Table_Profiles’,
        ‘mappingName’    => ‘profiles’,
        ‘foreignKey’     => ‘user_id’,
        ’saveAssocMethod’=> ’save’
);

var $hasMany = array(
        ‘tableClass’     => ‘Table_Profiles’,
        ‘mappingName’    => ‘profiles’,
        ‘foreignKey’     => ‘user_id’,
        ’saveAssocMethod’=> ’save’
);

var $manyToMany=array(

);

一个表可以有多个关联
var $hasMany = array(
        array(
            ‘tableClass’ => ‘Model_Permissions’,
            ‘foreignKey’ => ‘pclass_id’,
            ‘mappingName’ => ‘permissions’,
        ),
        array(
            ‘tableClass’ => ‘Model_Products’,
            ‘foreignKey’ => ‘pclass_id’,
            ‘mappingName’ => ‘products’,
            ‘enabled’ => false,
        ),
[
array(
     ...
),
]
    );
关联: 一个关联是一个关系,这个关系属于某一个数据表。例如 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 关联中,要求外键放置在关联表中

分别对应FLEA_Db_TableDataGateway表中的 $hasOne,$hasMany,$manyToMany,$belongsTo 属性

我们下面就用 老师,学生,学生档案,班级的例子说说这几个关系。

以下是SQL代码:

//学生表
Create TABLE `testDB`.`student` (
  `stu_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `stu_name` VARCHAR(20) NOT NULL,
  `stu_class_id` INTEGER UNSIGNED NOT NULL,
  PRIMARY KEY (`stu_id`)
)

 

//学生档案表
Create TABLE `testDB`.`stu_record` (
  `record_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `stu_id` INTEGER UNSIGNED NOT NULL,
  `family_add` VARCHAR(150) NULL,
  `family_tel` VARCHAR(20) NULL,
  PRIMARY KEY (`record_id`)
)

//教师表
Create TABLE `testDB`.`teacher` (
  `teacher_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `teacher_name` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`teacher_id`)
)

//班级表
Create TABLE `testDB`.`classes` (
  `class_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `class_name` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`class_id`)
)

//由于教师与班级是多对多关系,所有建立一个中间连接表以表示该关联
Create TABLE `testDB`.`link_teacher_classes` (
  `link_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `teacher_id` INTEGER UNSIGNED NOT NULL,
  `class_id` INTEGER UNSIGNED NOT NULL,
  PRIMARY KEY (`link_id`)
)

现在,建好表之后,我们还要写几个继承自FLEA_Db_TableDataGateway父类的类,以对应数据库中的Student,Teacher,Classes表(连接表不用了)如下:

//学生表对应的类
class Model_Student extends FLEA_Db_TableDataGateway{
        var $tableName = ’student’;
        var $primaryKey = ’stu_id’;
       �
        /*
           这是一对一关系,一个学生对应唯一的一个Record档案
           tableClass 对应要与之关联一对一的表的对象类,即档案表的类
           foreignKey是在档案表中,对应学生表的一个外键接连字段,
           用该字段标识该档案属于哪个学生
           mappingName 就是用于在你查询学生信息时,学生档案字段的别名
        */
        var $hasOne = array(
                    ‘tableClass’ => ‘Model_Record’,
                    ‘foreignKey’ => ’stu_id’,
                    ‘mappingName’ => ‘record’
        );
        /*
           这是从属关系,一个学生属于某一个班级,换过来说就是班级与学生一对多,
           一个班级有多个学生,而学生就只属于一个班级
           tableClass 指定该类要与之有从属关系的类,这里是班级类
           foreignKey 这里指定的是该表里的连接外表的字段,这里是学生表的班级ID字段
           注意:这里的foreignKey指的是本表的字段,而上面hasOne关系中的foreignKey
           指的是外表中的字段,要注意区分清楚
           mappingName这里就不多说了,跟上面的一样,也是用于显示区分的别名
        */
        var $belongsTo = array(
                array(
            ‘tableClass’ => ‘Model_Classes’,
            ‘foreignKey’ => ’stu_class_id’,
            ‘mappingName’ => ‘class’
        )
        );
}

 

//档案表对应的类
class Model_Record extends FLEA_Db_TableDataGateway{
        var $tableName = ’stu_record’;
        var $primaryKey = ‘record_id’;
}

//教师表对应的类
class Model_Teacher extends FLEA_Db_TableDataGateway{
        var $tableName = ‘teacher’;
        var $primaryKey = ‘teacher_id’;

        /*
           这里确立了教师与班级的多对多关系,一个教师可以教多个班级
           而一个班级也有多个教师
           tableClass 指定要建立多对多关系的表的类
           joinTable 这个属性要注意一个,这个是指定教师表与班级表关系的连接表
           由于二维表的数据结构的原因,所以多对多关系要用一个中间表(即连接表)来表示
           连接表中就指明两个表各自的主键ID就可以了,以两个字段作复合主键,如不用复合
           主键,就新增加一个字段作主键也可,这没关系
        */
        var $manyToMany = array(
                array(
            ‘tableClass’ => ‘Model_Classes’,
            ‘mappingName’ => ‘class’,
            ‘joinTable’ => ‘link_teacher_classes’,
        )
        );
}

class Model_Classes extends FLEA_Db_TableDataGateway{
        var $tableName = ‘classes’;
        var $primaryKey = ‘class_id’;

        /*
            这里确立了班级与学生的一对多关系
            tableClass 指定该表的类要与哪个表的类建立一对多关系
            foreignKey 外键ID,这里即指定学生表中定义的班级ID,这个是外表的字段
        */
        var $hasMany = array(
                array(
            ‘tableClass’ => ‘Model_Student’,
            ‘foreignKey’ => ’stu_class_id’,
            ‘mappingName’ => ’students’
        )
        );

        var $manyToMany = array(
        // 由于多对多关系是双向的,所以班级表也可以定义上与教师表的多对多关系
        // 也可以不写,看需求而定,比如你想查看某个班级信息时,一并显示该班
        // 有多少个任课老师的话,那就在这个班级类里加上关系,我这里就不写了。。。
        );
}

以上的代码就建立好了关系了,现在只管使用就是了。
不过还提醒大家一点,在每个关系里,都有一个 ‘enabled’ 的属性,如果设置为 false的话,则是将该关系禁掉,所以查询出来的结果就没有该关系的相应数据,这样可以节省效率,按需要时才打开相应的关联,该属性默认为true 可以如下设置:

array(
    ‘tableClass’ => ‘Model_Student’,
    ‘foreignKey’ => ’stu_class_id’,
    ‘mappingName’ => ’students’,
    ‘enabled’ => false
)

现在我们来测试一下数据。(事先自行插入几行数据用以测试)

$classManager = FLEA::getSingleton(’Model_Classes’);
$class =& $classManager->find(array(’class_id’ => 1));
dump($class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值