需要在 CodeIgniter 3 中使用 MySQL 表创建图表

Posted

技术标签:

【中文标题】需要在 CodeIgniter 3 中使用 MySQL 表创建图表【英文标题】:Need to create a chart using a MySQL table in CodeIgniter 3 【发布时间】:2022-01-21 07:34:36 【问题描述】:

我需要使用下表创建一个动态表。不管是来自 ChartJS 还是 Google Chart。我需要将 Y 轴的“血型”作为标签,对于 X 轴,我需要获取“isAvailable”等于 1 的每种血型的行数。

Table

我尝试了上面的方法,它将数据获取到视图中,但需要为每种血型重写代码,因此效率不高。我想知道有没有更好的方法?

控制器

public function bloodTypesChart()
    
        $query =  $this->db->query("SELECT COUNT(PacketID) as count,(BloodType) as blood_type FROM packets WHERE (isAvailable) = '1'");

        $packetCount = $this->db->count_all_results();

        $record = $query->result();
        $chartData = [];

        foreach($record as $row) 
            $chartData['label'][] = 'O+';
            $chartData['data'][] = $packetCount;
        
        $chartData['chart_data'] = json_encode($chartData);
        $this->load->view('insight',$chartData);
    

【问题讨论】:

【参考方案1】:

这可能不是最有效的解决方案,但它一定会为您完成工作。

public function bloodTypesChart()
 
   $totalPackets = $this->db->count_all_results();
 
   $chartData = [];
   $blood_types = $this->db->query("SELECT (BloodType) as blood_type FROM packets WHERE (isAvailable) = '1' GROUP BY blood_type")
                       ->result_array();

   foreach($blood_types as $bt)
   
      $record =  $this->db->query("SELECT COUNT(PacketID) as count FROM packets WHERE BloodType = '$bt['blood_type']'")
                      ->result_array();

      foreach($record as $row) 
         $chartData['label'][] = $bt['blood_type'];
         $chartData['data'][] = $row['count'];
      
   
$chartData['chart_data'] = json_encode($chartData);
$this->load->view('insight',$chartData);

    

推荐:你也可以试试这样的

$record =  $this->db->from('packets')
                ->select('count(PacketID) count, BloodType blood_type')
                ->group_by('blood_type')
                ->get()
                ->result_array();

foreach($record as $row) 
   $chartData['label'][] = $row['blood_type'];
   $chartData['data'][] = $row['count'];

当然,您仍然可以使用 query() 方法并手动编写查询。

我没有测试任何这些,但它应该让你知道下一步该去哪里。

【讨论】:

感谢@3m1n3n3 的回答。这给出了一个错误,指出“不能将 stdClass 类型的对象用作数组”。你知道为什么吗? 我将 $record 查询更改为 "SELECT COUNT(PacketID) as count WHERE BloodType = '$bt->blood_type'" 并给出错误提示 SELECT COUNT(PacketID) as count WHERE BloodType = '' 对不起,我对我的回答做了一些更正。 很抱歉打扰您@3m1n3n3 但它仍然给出错误提示Call to undefined method CI_DB_mysqli_result::getResultArray() 对不起,我真的错过了,我必须设置一个 codeigniter 3 项目,所以我可以测试这个,我无法复制你的表结构,所以如果有错误肯定是一个错字,我'已经测试过了,它应该可以工作,让我知道你的观察和经验。【参考方案2】:

这是一个更好、更简单的解决方案。避免使用 php 循环获取数据。

public function bloodTypesChart()
    
        $query=" SELECT BloodType as blood_type, COUNT(PacketID) as mycount 
            FROM packets 
            WHERE isAvailable = 1 
            GROUP BY blood_type
         ";    

        $chartData = [];
        $blood_types = $this->db->query($query)->result_array();

        foreach($blood_types as $row)
        
                $chartData['label'][] = $row['blood_type'];
                $chartData['data'][] = $row['mycount'];
        
        $chartData['chart_data'] = json_encode($chartData);
        $this->load->view('insight',$chartData);
    

【讨论】:

以上是关于需要在 CodeIgniter 3 中使用 MySQL 表创建图表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CodeIgniter 3 中的外键从表中获取列数据

在 CodeIgniter 3 中访问关联数组中的数据

codeigniter 将非 www 重定向到 www

在 CodeIgniter 3 中多次渲染视图

数据表库在 CodeIgniter 3 中不起作用

将文件下载到桌面,其中字段名等于 codeigniter 中的文件名