我最近用Thinkphp3.2.3写了一个简单的RBAC(权限管理系统),在管理员表(qs_user)和管理员角色中间表(qs_role_user)遇到了关联更新出现错误的问题。我纠结了很久,才在thinkphp的代码中发现了问题。
模型代码如下:
protected $_link = array(
'Role'=>array(
'mapping_type'=>self::MANY_TO_MANY,
'class_name' => 'Role', //要关联的模型类名
'foreign_key'=>'user_id', //关联的外键名称
'relation_foreign_key'=>'role_id', //关联表的外键名称
'relation_table'=>'qs_role_user', //多对多的中间关联表名称
'mapping_fields'=>'id,name',
),
);
修改管理员数据代码如下:
$User = D('User');
$da['id'] = I('post.id','',int);
$da['username'] = strval(I('post.username'));
$da['email'] = strval(I('post.email'));
$da['qq'] = strval(I('post.qq'));
$da['tel'] = strval(I('post.tel'));
$da['relname'] = strval(I('post.relname'));
$da['status'] = strval(I('post.status'));
$da["Role"] = array(
'role_id'=>I('post.role','',int),
'user_id'=>$id
);
$User-> relation(true)->where(array('id'=>$id))->save($da);
$this->success('操作成功','/Admin/Rbac/user.html');
刚开始的时候不停的出现
然后我打印出SQL语句查看,发现sql语句是
INSERT INTO qs_role_user (user_id,role_id) SELECT a.id,b.id FROM qs_user AS a ,qs_role AS b where a.id =7 AND b.id IN (,)
发现这个sql语句本来就执行不通,造成的结果是,管理员表(qs_user)中的数据可以更改,管理员角色中间表(qs_role_user)中的关联数据被删除后,重新插入的时候产生错误。数据库里面没有新的数据生成。历经千辛万苦,我终于找到原来thinkphp3.2.3的
关联模型扩展RelationModel第340行源码有一些问题。
原代码是:
if(is_array($mappingData)) {
$ids = array();
foreach ($mappingData as $vo)
$ids[] = $vo[$mappingKey]; //原代码
$relationId = implode(',',$ids);
}
我将红色的地方修改成:
if(is_array($mappingData)) {
$ids = array();
foreach ($mappingData as $vo)
$ids[] = $vo;
$relationId = implode(',',$ids);
}
最后测试一下我发现我这边的功能都正常运转,今天特此记录一下,希望可以帮到各位做Thinkphp开发的码农们。
转载的请加上我们的链接:西安网站建设
http://www.sxqswl.net/show-23-67-1.html