如何在codeigniter中处理foreach循环中的sql查询

vs3odd8k  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(57)
function emp_attendence() {
$dept = $this->session->userdata("department") ;
                 function filter($value)
                    {
                      $dept = "'$value'" ;  
                      return $dept;
                    }
              $query = $this->db->query('select emp_id from employee where department IN ('.implode( ",",array_map("filter",$dept) ) .') order by emp_id asc');
              $emp = $query->result_array()  ; // echo '<pre>' ;  print_r($emp[0]['emp_id']) ; exit();  


          foreach( $emp as $emp_id) {
                    foreach( $emp_id as $id) {
              $query = "SELECT count(attendence) as total_attendence 
                   FROM employee
                   INNER JOIN attendence ON employee.emp_id = attendence.employee_id
                   WHERE emp_id='$id' AND MONTH(date)=MONTH(CURDATE())";

                   $query = $this->db->query($query);  
                   $query = $query->result_array() ;
                }
        } 

         return $query ;  
        }

字符串
上面的代码是codeigniter中的一个模型,我的目标是获得数据库中每个员工的总出勤率,代码运行良好,但我通过查询返回的最后一条记录的值不是所有记录!

u3r8eeie

u3r8eeie1#

实际上$query = $query->result_array() ;是一个变量赋值,因为它在循环中,所以它一次又一次地重复同一个变量。所以你只得到最后一个数据。
像下面这样做:
foreach( $emp as $emp_id) {之前定义$attendence_array = array();
$query = $query->result_array() ;改为$attendence_array[] = $query->result_array() ;
然后将return $query ;改为return $attendence_array ;
然后检查$attendence_array打印出来,它来罚款或不是你想要的

mutmk8jj

mutmk8jj2#

这确实需要一个完整的重构,你可以把所有的查询逻辑都放到一个查询中,而且应该这样做。
一个模型方法不应该知道它的输入来自哪里。换句话说,你不应该硬编码这个方法来从会话数组中提取$dept。相反,把所有的输入参数作为参数传递给这个方法,这样你的模型方法就很容易测试和重用。
CodeIgniter有特殊的语法来编写IN与占位符的比较(直接将变量注入到$sql字符串中并不是最佳实践)。在IN之后,不要将占位符?括在括号中- CI会为您做这件事。此外,CI将用适当的引号引用 Package 字符串。
下面的新脚本将只访问数据库一次,并返回一个关联数组,其中emp_id值作为键,计数作为值。

public function empAttendence(array $dept): array
{
    $sql = "SELECT e.emp_id,
                   COUNT(1) total_attendence 
            FROM employee   e
            JOIN attendence a ON e.emp_id = a.employee_id
            WHERE e.department IN ?
                  AND MONTH(a.date) = MONTH(CURDATE())
            GROUP BY e.emp_id
            ORDER BY e.emp_id";

    return array_column(
        $this->db->query($sql, [$dept])->result_array(),
        'total_attendance',
        'emp_id'
    );
}

字符串

相关问题