0

当我从另一个模型(使用 CodeIgniter &get_instance)调用模型时,会出现不需要的行为,传递给 $this->db->where() 和 $this->db->select() 之前模型的约束移动到下一个模型。

我正在处理我们需要将模型调用到另一个模型(链式/依赖项)的场景——尽管在社区 CodeIgniter 中似乎不是一种常见的做法。

下面我详细介绍了我的senary。

/Application/models/data_access/produto/produto_dao.php:

class Produto_dao extends CI_Model
{
    private $ci;

    public function __construct()
    {
        parent::__construct();
        $this->ci =& get_instance();
        $this->dependenciesEntity();
    }

    private function dependenciesEntity()
    {
        $this->ci->load->model('entity/produto/produto');
        $this->ci->load->model('entity/produto/produto_collection');
        $this->ci->load->model('data_access/produto/categoria_dao');
    }

    public function getProdutos($filtros, $inicioPaginacao = 0)
    {
        $this->db->select('produtos.id');
        $this->db->select('produtos.uri');
        $this->db->select('produtos.seo_keywords AS keywords');

            $this->db->where('produtos.id', '1349');

        $result = $this->db->get('produtos');

            var_dump( $this->db->last_query() );

        return $this->collectResult($result->result());

    }

    private function collectResult($result)
    {
        $produtoCollection = new Produto_collection();

        foreach($result as $value){
            $produto = new Produto();
            $produto->setId($value->id);
            $produto->setCategoria( $this->getCategoria( $value->id ) );
            $produto->setUri($value->uri);
            $produto->setKeywords($value->keywords);

            $produtoCollection->addProduto($produto);
        }
        return $produtoCollection;
    }

    private function getCategoria($idProduto)
    {
        $categoria = new Categoria_dao();
        return $categoria->getCategoria($idProduto);
    }

}

这里我们有依赖,/application/models/data_access/produto/categoria_dao.php

class Categoria_dao extends CI_Model
{
    private $ci;

    public function __construct()
    {
        parent::__construct();
        $this->ci =& get_instance();
        $this->dependenciesEntity();
    }

    private function dependenciesEntity()
    {
        $this->ci->load->model('entity/produto/categoria');
        $this->ci->load->model('entity/produto/categoria_collection');
    }

    public function getCategoria($id)
    {

        $this->db->select('categorias.id');
        $this->db->select('categorias.id_pai AS idPai');

        $this->db->where('categorias.id',$id);

        $result = $this->db->get('categorias');

                var_dump( $this->db->last_query() );

        return $this->collectResult($result->result());
    }

    private function collectResult($result)
    {
        $categorias = new Categoria_collection();

        foreach($result as $value){
            $categoria = new Categoria();

                $categoria->setId($value->id);
            $categoria->setCategoriaPai( $this->getCategoriaPai( $value->idPai ) );

            $categorias->addCategoria($categoria);
        }
        return $categorias;
    }

    private function getCategoriaPai($id)
    {
        if($id){
          return $this->getCategoria($id);
     }
     return new Categoria_collection();
    }   
}

当我运行时,我得到了 $this->db->last_query() 的以下结果

produto_dao.php last_query()

SELECT produtos.id, produtos.uri, produtos.seo_keywords AS keywords FROM produtos WHERE produtos.id = '3454'

categoria_dao.php last_query()

SELECT produtos.id, produtos.uri, produtos.seo_keywords AS keywords, categorias.id, categorias.id_pai AS idPai FROM categorias WHERE categorias.id = '39' AND produtos.id = '3454'

知道为什么会这样吗?

4

1 回答 1

1

You have to flush the cache to do this consecutive query as it is explain here :

CodeIgniter : Active recode caching

First query

$this->db->start_cache();
$this->db->select('field1');
$this->db->stop_cache();

When you are going to execute a new query, do :

$this->db->flush_cache();

It's going to give you a brand new query to work with.

Hope it helps.

于 2013-04-29T22:44:23.700 回答