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

Posted

技术标签:

【中文标题】如何使用 CodeIgniter 3 中的外键从表中获取列数据【英文标题】:How to fetch columns data from a table using the foreign key in CodeIgniter 3 【发布时间】:2022-01-14 17:49:10 【问题描述】:

您好,首先我应该告诉您,英语不是我的第一语言,所以请原谅任何误解。我在这里尝试的是使用“数据包”表中的外键访问“捐助者”表数据,我需要在控制器中获取该数据以使用。我认为PacketID 在我看来,在staff 控制器中,我需要获取特定的DonorMobileDonorName 才能向该捐赠者发送短信。我曾尝试创建多个模型函数,但没有奏效。可以通过这种方式完成还是有其他方式?蒂亚!

donorspackets 表的屏幕截图

donors table 和 packets table

员工控制器 - 我知道您无法在控制器中访问像 $donorData->DonorID 这样的数据

public function markAsUsed($packet)
    
            $this->load->Model('Donor_Model');
            $donorData = $this->Donor_Model->getDonors($packet);

            $this->load->Model('Donor_Model');
            $data = $this->Donor_Model->markAsUsed($donorData->DonorID);

            $sid = 'twilio sid';
            $token = 'twilio token';
            $donorMobile = '+94' . $donorData->DonorMobile;
            $twilioNumber = 'twilio number';

            $client = new Twilio\Rest\Client($sid, $token);
            $message = $client->messages->create(
                $donorMobile, array(
                    'from' => $twilioNumber,
                    'body' => 'Thank you ' . $donorData->DonorName . ' for your blood donation. Your donation has just saved a life.'
                )
            );

            if ($message->sid) 
                $this->load->Model('Donor_Model');
                $this->Donor_Model->changeStatus($data->isAvailable);
                redirect('staff/viewpackets');


型号

function getDonors($packet) 
        $data = $this->db->get_where('packets', array('PacketID' => $packet));
        return $data->row();
    

function markAsUsed($donor)
    
        $data = $this->db->get_where('donors', array('DonorID' => $donor));
        return $data->row();
    

function changeStatus($packet)
    

        $data = array(
            'isAvailable' => False,
        );

        return $this->db->update('packets', $data, ['PacketID' => $packet]);
    

【问题讨论】:

请阅读joining tables,这里很好地解释了几种连接方式:blog.codinghorror.com/a-visual-explanation-of-sql-joins 【参考方案1】:

找到答案了!您只能使用控制器来执行此操作。

$packetData = $this->db->get_where('packets', array('PacketID' => $packet));

            foreach ($packetData->result() as $row) 
                $donorID = $row->DonorID;
                $packetDonatedDate = $row->DonatedDate;
            

$donorData = $this->db->get_where('donors', array('DonorID' => $donorID));

            foreach ($donorData->result() as $row) 
                $donarName = $row->DonorName;
                $donorMobile = $row->DonorMobile;
            

【讨论】:

【参考方案2】:

您在答案中所做的事情是不可取的,当您拥有大型数据集时,使用循环从表中提取会大大降低系统速度。预期是使用 JOIN 查询来连接捐助者和数据包表,如下所示:

$this->db->select('donors_table.DonorName,donors_table.DonorMobile,packets_table.*')->from('packets_table');
$this->db->join('donors_table','donors_table.DonorID=packets_table.DonorID');
$query = $this->db->get();
$result = $this->db->result();

然后你可以遍历每个捐助者如下:

foreach($result as $row)
   $donarName = $row->DonorName;
   $donorMobile = $row->DonorMobile;

注意:始终建议从模型中执行任何获取、插入、删除或更新操作,这就是 Codeigniter 是 MVC 的原因。停止直接从控制器中的数据库中获取数据。

【讨论】:

以上是关于如何使用 CodeIgniter 3 中的外键从表中获取列数据的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 Laravel 中的外键从数据库中提取多行

使用外键从表中删除

给springmvc接口快速增加字段检索,外键从表检索,外键从表查询的searchdb注解

给springmvc接口快速增加字段检索,外键从表检索,外键从表查询的searchdb注解

10.14数据库基础

PHP Laravel 根据投票表的外键从问题表中获取所有问题