根据发送到codeigniter中的视图的数据在视图中执行模型函数

时间:2016-10-10 20:51:19

标签: php codeigniter

我有一个控制器从模型中获取数组并将其发送到视图。样本表

user id    user name    user email
1          Mike         mike@yahoo.com
2          Tom          Tom@live.com

现在我已经为模型添加了另一个函数来从另一个表中获取另一个数据数组,以便该表中的每个用户看起来像这样

user id    user name        user email
1          Mike             mike@yahoo.com
order:10   order total:50   order date: 2016-09-12
order:12   order total:100  order date: 2016-09-14
2          Tom              Tom@live.com
order:15   order total:80   order date: 2016-09-13
order:16   order total:120  order date: 2016-09-14
order:17   order total:140  order date: 2016-10-10

Controller的index()函数包含此代码

$this->data['users'] = $users; //fetches data from a model function
$this->data['content'] = $this->load->view('users_view', $this->data);

所以我有函数订单($ user_id)从用户的DB中获取订单。视图代码:

<table>
        <tr>
            <th>
                 <?php echo 'user id';?>
            </th>
            <th>
                 <?php echo 'user name';?>
            </th>
            <th>
                <?php echo 'user email';?>
            </th>         
        </tr>
        <?php foreach($users as $val){
            ?>
            <tr>
                <td>
                     <?=$val->user_id?>
                </td>
                <td>
                    <?=$val->user_name;?>
                </td>
                <td>
                     <?=$val->user_email;?>
                </td>                   
            </tr>
        <?php       
        // how to call the model function here and loop through the orders array to 
display orders for each user?

        }?>

    </tbody>
</table>

2 个答案:

答案 0 :(得分:2)

你绝对不会这样做。这是完全错误的。这是应该如何做的:

  1. 请求控制器
  2. 控制器调用相关的库和模型以获取数据
  3. Controller将数据发送到视图
  4. 因此,在您的控制器中,您需要从一个模型为用户调用您的数据,然后foreach用户从另一个模型获取订单。如何在模型或库中执行此操作当然取决于您,但控制器需要预先收集所有必需的数据。

    在构建视图时,您的控制器或模板库或页面模型可能会调用其他子视图或局部视图来为页面块,模块或页面的设置部分创建字符串。然后将这些字符串用作主视图的一部分。或者您的主视图可能会直接调用其他视图。无论哪种方式,视图所需的数据都应发送到视图。如果视图调用其他部分(我个人厌恶但有些人似乎喜欢它),所有数据都会发送到原始视图,而部分只发送它作为原始数据集的子集所需的数据。

    视图永远不应该调用模型,其他控制器或库。将它们视为页面设计的静态元素,只需接收原始数据并指示如何显示该数据。就是这样。

    以同样的方式,你的控制器或模型中永远不应该有HTML,你应该永远不要在视图中使用PHP处理(除了foreach循环,if语句等布局结构)。

答案 1 :(得分:1)

您应该将订单表索引为与其他表具有一些共同的索引键,例如用户名(order_username),用户ID(order_userid),用户电子邮件(order_useremail),因此您只能获取用户名/用户发出的订单ID /电子邮件。

说这是你的控制器:

class MY_Controller extends CI_Controller 
{
    public function __construct() 
    {
        parent::__construct();
        //Load My_Model
        $this->load->model("my_model");
    }


    public function index() 
    {
        $users = $this->my_model->get_users();
        foreach ($users->username as $user) {
            $user_orders = $this->my_model->get_orders_by_username($user);
        }
        $this->load->view('users_view', array("user_orders" => $user_orders, "users" => $users));
    }
}

这是您的模型,它使用相同的用户名共享来自users表和订单表的数据:

class MY_Model extends CI_Model 
{
    public function get_users() 
    {
        $results = $this->db->get('users');
        return $results;
    }

    public function get_orders_by_username($user)
    {
        $this->db->select('*');
        $this->db->where("order_username", $user);
        $results = $this->db->get('orders');
        return $results;
    }
}

现在您可以在视图文件中查看数据,您可以像这样使用它们: $ users-&gt; username - $ users-&gt; email,或者像foreach循环一样:

foreach ($users as $user) {
    foreach ($user_orders as $order) {
    echo "$user->user_name , $user->user_lastname - $user->user_email";
    echo "$order->orders_date - $order->orders_count";
    }
}