关于多对多表关联的问题

#1 zhangbangyue

一共有5个表,写SQL是非常简单的事,但我想用你提供的多对多解决,我试了几次不成功。
希望能给点意见和方法,特别是在写model与方法如何来做。
1、user用户表
sp2.jpg
2、user_role 用户表关联角色,就是一个用户可以有多个角色
sp1.jpg
3、function 功能表[controller+action]
sp3.jpg
4、role 角色表,定义系统中的角色
sp4.jpg
5、role_function 角色与功能关联
sp5.jpg

我要用多user_role->role->role_function,来获取一个用户有哪个权限,如果写出以下类似的model?
已经有二个表的列子,
但三个表,四个表,五个表,或者更多一点如何设定他们之间的关联,这在系统开发中经常用到,如何保存数据到数据表中。
谢谢你!

class farm_user extends spModel  
{  
     public $pk = 'uid';  
     public $table = 'user';  

     var $linker = array(  

        array(  
                'type' => 'manytomany',   // 多对多关联  
                 'map' => 'farms',    // 关联的标识  
                 'midclass' => 'farm_user2fruit', // 关联的中间表  
                 'mapkey' => 'uid',  // 关联的字段  
                 'fclass' => 'farm_fruit', // 对应表的数据类  
                 'fkey' => 'fruitid', // 对应表的关联字段  
                 'enabled' => true  
         ),  
     );  
}

2010-11-20 08:54:16

#2 jake

SP的数据关联是比较初步的,只支持两个关联表或者两个关联表加中间表三表的一些关联。也就是说封装了日常比较常见的一对一,一对多,多对多几种方式的两表关联。是一种“强关联”,也就是有直接关联的关联。

但是五个表关联,那是语意上的关联,他们之间的关系,有一对一,也有多对多。那是需要多次进行关联才能做到。

我给楼主的建议,是对其进行封装。首先你可以大致上规划这五个表,或者说是五个数据类model,他们分别需要什么样的功能。举例,function表,也就是功能集model,它的功能应该是“按角色获取C+A”,“批量进行角色的C+A操作”等等。这些操作,都可以封装到功能集model中。

class lib_function{
var $pk = 'xx';
var $table = 'xx';
function get_ca($roles){
xxx
}
function set_ca($role, $cas){
xxx
}

}

这是将数据表变成数据类的优势,这样封装了数据操作,那么这个类就可以“重用”,提供效率。

具体可以参考一下winblog例子,论坛里面搜索有,有部分model被重用的示例。

2010-11-20 09:56:08

#3 zhangbangyue

好,应该可以解决!

2010-11-20 10:38:08