在视图codeigniter中调用模型函数

时间:2014-02-09 18:09:00

标签: php mysql database codeigniter model-view-controller

我是MVC的新手,我正在将一个用非MVC风格编写的项目移植到MVC,但我遇到了一个需要在View中调用Model函数的问题。

情境:

表1 - 产品:
包含product_idproduct_name等,每个产品都有多个版本。

表2 - 版本:
包含version_idversion_name,...,product_id等。

现在在View中我正在显示产品,在每个产品标题下我必须显示该产品的版本列表,在非MVC样式中它非常简单,我可以在View中使用以下代码片段:

foreach ($product as $row) 
{
    echo $row['product_name'];
    if ($main->getVersionList($vresult,$row["product_id"]))
    {
        foreach ($vresult as $vrow)
        {
          echo $vrow['version_name'];
        }
    }
}

现在,我可以将Product数组从控制器传递到视图,但是每个需要根据每个产品生成的 Version 数组呢?

更新

这是我在控制器中的最终工作解决方案(使用地图):

        $this->load->model ( 'product_mod' );
        $data ['products'] = $this->product_mod->getProductList ();
        $data ['versions'] = array ();
        foreach ( $data ['products'] as $product )
        {
            $data ['versions'] [$product['product_id']] =   $this->product_mod->getVersionList ( $product['product_id'] );
        }

3 个答案:

答案 0 :(得分:6)

MVC或不是MVC

我应该注意的第一件事是 It is impossible to write classical MVC in PHP 。事实上,类似MVC的PHP框架(如CodeIgniter或Yii)实现了sort of MVP,其中:

  • 视图是被动的,不知道模型
  • 演示者(控制器)更改模型状态,读取信息并将其传递给视图

tereško

的信用

CodeIgniter方法

但是,特别是在CodeIgniter中,您有3个步骤:

  • 创建模型以查询数据库并返回数据(作为数组或对象)
  • 模型(模型的方法)创建控制器加载获取结果 ,并将返回的数据传递给视图
  • 创建查看并使用PHP循环来回显结果,构建HTML。

全力以赴

考虑到上述方法,您需要从模型中的数据库中获取结果:

<强>应用/模型/ product.php

class Product extends CI_Model
{
    public function get_product($product_id)
    {
        $this->db->select('*')->from('products');
        $this->db->where('product_id', $product_id);
        $this->db->join('versions', 'versions.product_id = products.product_id');
        $query=$this->db->get();
        return $query->first_row('array');
    }
}

然后在Controller中获取并传递结果:

<强>应用/控制器/ products.php

class Products extends CI_Controller
{
    public function view($product_id)
    {
        $this->load->model('product');
        // Fetch the result from the database
        $data['product'] = $this->product->get_product($product_id);
        // Pass the result to the view
        $this->load->view('product_view', $data);
    }
}

最后,使用视图中返回的数据生成列表:

<强>应用/视图/ product_view.php

// Use $product to display the product.
print_r($product);

答案 1 :(得分:2)

您应该在模型中进行mysql查询,例如products_model(不要忘记加载它)

示例查询:这只是从产品中选择*

public function All_Products()
{
$this->db->select('');
$result = $this->db->get('products')->result_array();
return $result;
}

正如我所看到的,你是像我一样的人,而不是使用大量查询。

在您的控制器中,您可以为您的模型加载$ products。

$products = $this->products_model->All_Products();

我的解决方案是创建一个新数组,然后在其中添加新值。还需要在模型中使用getVersionList函数。

$newArray = array ();
foreach ( $products as $values ) {
$version = $this->products_model->getVersionList($values['product_id']);
$tmp = array (
'product_id' => $values ['product_id'], 
'product_name' => $values ['product_name'], 
'version' => $version
);
array_push ( $newArray, $tmp );
}

因此,将新数组添加到您可以在视图文件中使用的$ data。

$data ['products'] = $newArray;

对不起,我没有弄清楚你的所有疑问,但我认为如何捕鱼比教鱼更好。

答案 2 :(得分:0)

使用以下代码,您可以在视图文件中调用模型的方法。它对我有用,也很简单。

$CI =& get_instance();
$CI->model_name->method_name();