簡體   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