繁体   English   中英

CodeIgniter活动记录或关联数据表中的复杂查询

[英]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_idrole_id (您作为参数传递)组合没有匹配的页面:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM