Search code examples
phpmysqlcodeigniteractiverecordlogical-grouping

CodeIgniter SELECT query to find rows with qualifying sets of column values in a JOINed table


I have this SQL query and It looks confusing enough for me to think how I will convert this to a Codeigniter Active Record query.

I considered looping through it getting by line like this:

for ( $i=1 ; $i<=5 ; $i++) {
    ${'line'.$i} = $this->staffrequisition_model->getRequestsToProcess($i, $staffInfo->position_depth, $staffInfo->department_group);
}
$data = array_merge($line1, $line2, $line3, $line4, $line5);

Using this method in my model

public function getRequestsToProcess($i, $depth, $departmentGroup)
{
    $this->db->select('*, ns_request_info.idx as request_idx, ns_staff_info.idx as staff_idx');    
    $this->db->from('ns_request_info');
    $this->db->join('ns_staff_info', 'ns_request_info.requested_by_idx = ns_staff_info.member_idx');
    $this->db->where('line'.$i.'', $depth);
    $this->db->where('line'.$i.'_action', 'PENDING');
    if ($departmentGroup != 'HIGHER TIER') {
        $this->db->where('ns_staff_info.department_group', $departmentGroup);
    }
    $this->db->where('status', 'PENDING');
    $this->db->or_where('status', 'ONGOING');
    $this->db->where('line' . $i . '', $depth);
    $this->db->where('line' . $i . '_action', 'PENDING');
    if ($departmentGroup != 'HIGHER TIER') {
       $this->db->where('ns_staff_info.department_group', $departmentGroup);
    }
    $this->db->order_by('idx', 'desc');
    $query = $this->db->get();
    return $query->result_array();
}

But I realized that doing array merge for all of them would destroy the sorting of the id's of the result.

I have here my SQL query and I have no idea on how to transform this into a Codeigniter Active Record query.

SELECT *, ns_request_info.idx as request_idx, ns_staff_info.idx as staff_idx 

FROM `ns_request_info` 
INNER JOIN `ns_staff_info` 
    ON ns_request_info.requested_by_idx = ns_staff_info.member_idx 
WHERE
    (
        (ns_request_info.line1=1 AND ns_request_info.line1_action='PENDING')
        OR (ns_request_info.line2=1 AND ns_request_info.line2_action='PENDING')
        OR (ns_request_info.line3=1 AND ns_request_info.line3_action='PENDING')
        OR (ns_request_info.line4=1 AND ns_request_info.line4_action='PENDING')
        OR (ns_request_info.line5=1 AND ns_request_info.line5_action='PENDING')
    )
    AND (ns_request_info.status='PENDING' OR ns_request_info.status='ONGOING') 
ORDER BY ns_request_info.idx DESC

Solution

  • public function getRequestsToProcess($depth,$departmentGroup)
        {
            $this->db->select('*, ns_request_info.idx as request_idx, ns_staff_info.idx as staff_idx');    
            $this->db->from('ns_request_info');
            $this->db->join('ns_staff_info', 'ns_request_info.requested_by_idx = ns_staff_info.member_idx');
            $this->db->where("((ns_request_info.line1=".$depth." AND ns_request_info.line1_action='PENDING') OR (ns_request_info.line2=".$depth." AND ns_request_info.line2_action='PENDING') OR (ns_request_info.line3=".$depth." AND ns_request_info.line3_action='PENDING') OR (ns_request_info.line4=".$depth." AND ns_request_info.line4_action='PENDING') OR (ns_request_info.line5=".$depth." AND ns_request_info.line5_action='PENDING'))");
            $this->db->where("(ns_request_info.status='PENDING' OR ns_request_info.status='ONGOING')");
            if($departmentGroup!='HIGHER TIER'){ $this->db->where('ns_staff_info.department_group', $departmentGroup); }
            $this->db->order_by('ns_request_info.idx', 'desc');
            $query = $this->db->get();
            return $query->result();
        }