以下是从page_page_access表中获取页表和相应access_level的所有记录的查询,通过page.id连接到给定的roleid。 $ roleid是此方法的参数。
$query = 'select p.*,t.access_level from page p '.
'left join (SELECT p.id,rpa.role_id,rpa.access_level FROM page p '.
'left join role_page_access rpa on rpa.page_id = p.id '.
'where rpa.role_id = ' . $roleid . ') as t on p.id = t.id';
实际上,我需要将此查询用于点燃的数据表。但至少如果我可以将其转换为活动记录,那将非常有帮助。
有没有办法在活动记录中指定常规查询? 否则如何将其转换为活动记录?
更新: 页表具有页面,而role_page_access表具有userrole和page之间的映射,并带有整数字段“access_level”以指定是否具有访问权限。如果没有映射也被视为无法访问。
我想要来自page的所有记录,并通过pageid和给定角色来匹配来自role_page_access的access_level。因此,如果在映射表中找不到匹配的记录,则会有null access_level。
我必须在$this->db
或$this->datatables
中使用此功能。
答案 0 :(得分:0)
你可以像这样使用activerecord:
$this->-db->select('page.*,role_page_Access.access_level');
$this->db->from('page');
$this->db->join('role_page_access', 'role_page_access.page_id = page.id', 'left outer');
$this->db->where('role_page_access.role_id', $role_id);
$query = $this->db->get();
foreach($query->result() as $row) {
if(empty($row->access_level)) {
echo 'Role does not have access';
} else {
echo 'Role has access';
}
}
如果匹配,page
表记录与role_page_access
表记录与page.id
表记录一起加入,由您传递的role_id
过滤。
如果您有受支持的PHP版本,甚至可以进行方法链接,请查看参考here。
<强>更新强>
如果你仍想要检索页面记录,即使role_id
没有访问权限,你只需将连接设置为左外:
$this->db->join('role_page_access', 'role_page_access.page_id', 'left outer');
即使它们与role_page_access
上的某个角色不匹配,也会为所有页面记录提供记录,而结果集对象在NULL
上的值为role_page_access
。我更新了原始代码,向您展示了一个示例。
更新2
如果您想按role_id
进行过滤,但仍有不匹配的记录:
$this->db->where('role_page_access.role_id', $role_id);
$this->db->or_where('role_page_access.role_id', NULL);
但您必须按access_level
过滤它们以检查NULL
是否原因,这意味着page_id
和{{没有匹配的页面1}}(你作为param传递)组合: