CodeIgniter Active Record或Ignited Datatables中的复杂查询

时间:2014-03-03 18:22:04

标签: php mysql codeigniter jquery-datatables

以下是从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中使用此功能。

1 个答案:

答案 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传递)组合: