[英]Complex Query in CodeIgniter Active Record or Ignited Datatables
以下是查询以获取页面表中的所有记录以及来自role_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和页面之间的映射,其中整数字段“ access_level”用于指定是否具有访问权限。 如果没有映射,也视为没有访问权限。
我想要页面中的所有记录,并按pageid和给定角色来匹配role_page_access中的access_level。 因此,如果在映射表中找不到匹配的记录,则访问级别将为null。
我必须在$this->db
或$this->datatables
。
您可以使用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.id
字段将page
表记录与role_page_access
表记录page.id
起来,并根据传递的role_id
过滤。
如果您具有受支持的PHP版本,甚至可以进行方法链接,请在此处查看参考。
更新
如果即使该role_id
没有访问权限,您仍要检索页面记录,则只需将role_id
设置为左外部即可:
$this->db->join('role_page_access', 'role_page_access.page_id', 'left outer');
即使它们与role_page_access
上的角色不匹配,并且所有结果集对象在role_page_access
上具有NULL
值,也将为所有页面记录。 我更新了原始代码,向您展示了一个示例。
更新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
原因(如果为NULL
),这意味着page_id
和role_id
(您作为参数传递)组合没有匹配的页面:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.