我使用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;