netljc
(Netliujuncheng111)
1
用户表字段:id,账号(name),密码(password)
用户-角色表:id,用户id(uid),角色标记(code)
角色表:id,角色名称(role),角色标记(code)
现在需要在用户的列表页面根据角色筛选用户,一个用户可同时拥有多个角色,User模型的关联情况:
public function relations(){
return array(
'role'=>array(self:HAS_MANY,'Assignment','uid'),
)
}
UserController.php现在所写的代码
$criteria->with=array(
'role'=>array(
'condition'=>'role.code="'.$_POST['code'].'"'
),
)
但现在在用户列表页面选择角色提交过去后,搜索出来的结果还是所有的用户,只是用户关联出来的角色减少了,请问各位有什么好点的办法直接在用户的列表页面(不能在角色列表反向关联)通过角色筛选出现在所选这个角色下的所有用户。
phpmyadmin中用下面sql可以实现效果:
select a.* from user as a left join Assignment as b on a.id=b.uid where b.code="$_POST[‘code’]";
如果你要实现,一个用户有多个权限的话,需要使用many to many的方式连接表。
在YII里面,如果要实现many to many的连接,需要再建一张辅助表,
例如(role_child)
user_id role_id
然后在User的Relations里面这么写
‘Roles’=>array(self::MANY_MANY, ‘Role’, ‘role_child(user_id, role_id)’)
这样就可以实现你说的一个用户多个角色
但是我不建议这样的权限分配方案,
如果你要实现这种一个用户多个角色,建议参考CDbAuthManager
netljc
(Netliujuncheng111)
3
非常感谢!这个方法确实起作用了,但现在用:
$criteria->with=array(
‘role’=>array(‘condition’=>‘role.name="’.$_POST[‘name’].’"’)
)
查询的时候,这个$criteria->with,貌似在使用CPagination后就消失了,user:Model()->findAll($criteria)查询出来的数据就和没有加$criteria->with一样。只要把分页CPagination这段代码去掉,效果就对了,这事什么原因啊!
看你的分页代码怎么将分页的条件写到criteria里面的
$pages->applyLimit($criteria);
我是这样写的
netljc
(Netliujuncheng111)
5
就是这也写的啊!但就是写了之后,findall时with的内容就没有了