【问题标题】:How to convert a result set to an array of objects with Codeigniter's Active Record? [duplicate]如何使用 Codeigniter 的 Active Record 将结果集转换为对象数组? [复制]
【发布时间】:2018-05-28 07:50:47
【问题描述】:

这是我的控制器:

public function index()
{
    $data['page_title'] = 'Home';
    $data['new_grievances'] = $this->admin_home->get_members();
    $data['num_row'] = count($data['new_grievances'] );
    print_r($data['new_grievances']);
    print_r($data['num_row']);
    $this->load->view('admin/grievances_admin_home' , $data);
}

这是我的模型:

function get_members() {
    // $query = $this->db->get('enquiry');
    // return $query;
    $this->db->from('enquiry a');
    $this->db->join('enquiry_department b', 'a.department=b.id' , 'inner');
    $this->db->join('enquiry_user_type c', 'a.user_type=c.id' , 'inner');
    $this->db->WHERE('a.status IS NULL');
    $query = $this->db->get(); 
    return $query;
}

我想获取行数和行数。

在这里,我执行查询 $data['new_grievances'] 行数为 0,因此 $data['num_row'] 的输出必须返回零。

当我得到至少一行的结果时,我会打印它给出的 $data['new_grievances'] 值:

CI_DB_mysqli_result Object (
    [conn_id] => mysqli Object (
        [affected_rows] => 0
        [client_info] => mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $ 
        [client_version] => 50011
        [connect_errno] => 0
        [connect_error] =>
        [errno] => 0
        [error] =>
        [error_list] => Array ( )
        [field_count] => 12
        [host_info]
        ...

如何获取结果集中的行?

【问题讨论】:

    标签: php mysql codeigniter activerecord resultset


    【解决方案1】:

    通过此将您的代码从 return $query; 更改为 return $query->result();,您也可以在视图中使用您的 $data 并计算控制器中的总结果。

    这是控制器

    public function index()
    {
        $data['page_title'] = 'Home';
        $data['new_grievances'] = $this->admin_home->get_members();
        $data['num_row'] = count($data['new_grievances'] );
        print_r($data['new_grievances']);
        print_r($data['num_row']);
        $this->load->view('admin/grievances_admin_home' , $data);
    }
    

    这是我的模特

    function get_members() {
        $this->db->from('enquiry a');
        $this->db->join('enquiry_department b', 'a.department=b.id' , 'inner');
        $this->db->join('enquiry_user_type c', 'a.user_type=c.id' , 'inner');
        $this->db->WHERE('a.status IS NULL');
        $query = $this->db->get(); 
        return $query->result();
    }
    

    【讨论】:

    • 如果数据库中没有行则报错信息:count(): Parameter must be an array or an object that implement Countable
    • @user9437856 那么你做了一些不同/不正确的事情。 Codeigniter 的result() 方法无条件返回一个数组。如果结果集中没有行,则返回一个空数组。如果结果集中有行,则返回一个对象数组。
    【解决方案2】:

    请遵循以下几行。

    public function index()
    {
        $data['page_title'] = 'Home';
        $new_grievances = $this->admin_home->get_members();
        $data['num_row'] = $new_grievances->num_rows();
        print_r($new_grievances->result());
        $data['new_grievances'] = $new_grievances->result()
        print_r($data['num_row']);
        $this->load->view('admin/grievances_admin_home' , $data);
    }
    

    【讨论】:

    • 这个答案缺少教育解释。
    【解决方案3】:

    只需使用以下行从 DB 获取结果

    $query = $this->db->get(); $results = $query->result();

    并使用以下代码获取找到的行数 $count = $query->num_rows();

    【讨论】:

      【解决方案4】:
      public function index()
      {
          $data['page_title'] = 'Home';
          $data['new_grievances'] = $this->admin_home->get_members();
          /*Old Code
          $data['num_row'] = count($data['new_grievances'] );*/
          //New Code
          $data['num_row'] = $data['new_grievances'];
          print_r($data['new_grievances']);
          print_r($data['num_row']);
          $this->load->view('admin/grievances_admin_home' , $data);
      }
      

      型号

      function get_members() {
          $this->db->from('enquiry a');
          $this->db->join('enquiry_department b', 'a.department=b.id' , 'inner');
          $this->db->join('enquiry_user_type c', 'a.user_type=c.id' , 'inner');
          $this->db->WHERE('a.status IS NULL');
          return $this->db->count_all_results();
      }
      

      【讨论】:

      • OP 明确指出:i want to get the rows and and count of the number of rows. 这意味着您无法解释的答案没有提供所需的数据,因此不正确,应该删除。
      【解决方案5】:

      正如我在this similar answer 中所说,只要您在 MVC 结构的一层中仅使用行计数,声明计数变量并没有真正的好处。

      • 如果您只打算在您的视图中使用该值,则只在您的视图中调用count()
      • 如果您只想在 Controller 中使用该值,则只需在 Controller 中调用 count()
      • 如果您需要控制器和视图中的行数,请编写 D.R.Y.代码并将行数缓存为控制器中的变量,然后将其传递给视图。

      最终,我建议您不要使用可通过 O(1) 函数调用立即访问的数据来膨胀变量范围。

      【讨论】:

        猜你喜欢
        • 2013-06-17
        • 2019-01-08
        • 2015-12-13
        • 1970-01-01
        • 2011-04-13
        • 2014-03-05
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多