Как извлекать данные столбцов из таблицы с помощью внешнего ключа в CodeIgniter 3

#php #mysql #codeigniter #codeigniter-3

#php #mysql #codeigniter #codeigniter-3

Вопрос:

Привет, прежде всего, я должен сказать вам, что английский не является моим родным языком, так что извините за любые недоразумения. То, что я пытаюсь здесь, — это получить доступ к данным таблицы «доноры», используя внешний ключ в таблице «пакеты», и мне нужно получить эти данные в контроллере для использования. Я имею PacketID в виду, на мой взгляд, и в staff контроллере мне нужно получить конкретное DonorMobile и DonorName отправить SMS этому донору. Я пытался создать несколько функций модели, но это не сработало. Можно ли это сделать таким образом или есть какой-то другой способ? ТИА!

Скриншоты donors и packets таблицы

таблица доноров и таблица пакетов

Контролер персонала — я знаю, что вы не можете получить доступ к данным, как $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 TwilioRestClient($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]);
    }
 

Комментарии:

1. пожалуйста, прочитайте об объединении таблиц , здесь подробно описаны несколько способов объединения: blog.codinghorror.com/a-visual-explanation-of-sql-joins

Ответ №1:

То, что вы сделали в ответе, не рекомендуется, использование циклов для извлечения из таблиц приведет к значительному замедлению работы системы при наличии больших наборов данных. Ожидалось, что для объединения таблиц доноров и пакетов будут использоваться запросы 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. Прекратите извлекать данные непосредственно из базы данных в контроллерах.

Ответ №2:

Нашел ответ! Вы можете сделать это только с помощью контроллера.

 $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;
            }