Codeigniter -如果我从3查询获取行,如何从模型发送到视图


Codeigniter - If I have fetch row from 3 query, How to send from model to view?

我使用Codeigniter 3,我有多个查询如下

<?php
class Address_model extends CI_Model
{
    public function fetchAddress()
    {

            $this->db->where('username', $this->session->userdata('username'));
            $query = $this->db->get('member');
            $row = $query->row();
            $sql2 = "SELECT * FROM member_shipping_info WHERE member_id = ?";
            $query2 = $this->db->query($sql2, $row->member_id);
            $row2 = $query2->row();
                    $data['get_firstname'] = $row2->firstname;
                    $data['get_lastname'] = $row2->lastname;
                    $data['get_gender'] = $row2->gender;
                    $data['get_address'] = $row2->address;
                    $data['get_district'] = $row2->district;
                    $data['get_amphur'] = $row2->amphur;
                    $data['get_province'] = $row2->province;
                    $data['get_zipcode'] = $row2->zipcode;
                    $data['get_email'] = $row->email;
                    $data['get_phone'] = $row2->phone;

            $this->load->view('shopping/billing_view', $data);

问题是$row->email它来自$query1而不是2我应该如何从模型发送到控制器和从控制器发送到视图?我把模型,因为我必须使用这些查询多次在我的项目。

您需要重构代码。首先,你的insertAddress方法名称是误导,因为它没有插入任何地址的数据库。其次,你的代码在一个方法中做了太多的事情。第三,在模型内设置视图不是很好的MVC实践。

<?php
class Member_model extends CI_Model
{
    public function getMemberData($username) {
        $this->db->where('username', $username);
        $query = $this->db->get('member');
        return $query->row();
    }
    public function getShippingInfo($member_id)
    {
         $sql2 = "SELECT * FROM member_shipping_info WHERE member_id = ?";
         $query2 = $this->db->query($sql2, $member_id);
         return $query2->row();
    }
}

然后在控制器中:

<?php
    ...
     $username = $this->session->userdata('username');
     $memberData = $memberModel->getMemberData($username);
     $shippingInfo = $memberModel->getShippingInfo($memberData->member_id);
     $data['get_firstname'] = $shippingInfo->firstname;
     $data['get_lastname'] = $shippingInfo->lastname;
     ...
     $data['get_email'] = $memberData->email;
     $data['get_phone'] = $shippingInfo->phone;
     $this->load->view('shopping/billing_view', $data);

另一种选择是使用SQL join将模型中的两个查询合并为一个查询。

<?php
class Member_model extends CI_Model
{
    public function getMemberShippingInfo($username)
    {
         $sql2 = "SELECT member.*, ".
                 "member_shipping_info.* ".
                 "FROM member ".
                 "INNER JOIN member_shipping_info ".
                 "ON member.member_id = member_shipping_info.member_id ".
                 "WHERE member.username = ?";
         $query2 = $this->db->query($sql2, $username);
         return $query2->row();
    }
}

在你的控制器中:

<?php
    ...
     $username = $this->session->userdata('username');
     $memberData = $memberModel->getMemberShippingInfo($username);
     $data['get_firstname'] = $memberData->firstname;
     $data['get_lastname'] = $memberData->lastname;
     ... 
     $data['get_email'] = $memberData->email;
     $data['get_phone'] = $memberData->phone;