【问题标题】:Codeigniter - Calling a model method within same model is buggyCodeigniter - 在同一模型中调用模型方法是错误的
【发布时间】:2012-06-17 15:54:52
【问题描述】:

我试图在同一模型中调用模型方法,但它没有按预期工作。这是我的课,有两种不起作用的方法

class mymodel extends CI_Model{
    public function __construct(){
        parent::__construct();
        $this->tablea = 'tablea';
        $this->tableb = 'tableb';
    }

    public function saveData($data){
        $dataCopy['revisionkey'] = $this->getRevisionKey($data['id']);
        //check and condition revision key to be int with +1 from last one
        $this->db->insert($this->tableb, $dataCopy);
        $this->db->where('id', $id);
        return $this->db->update($this->user_table, $data) ? true : false;
    }

    public function getRevisionKey($id){
        $this->db->select($this->revision_tablea.'.revisions_number as revisions_number')
            ->from($this->revision_tablea)
            ->where($this->revision_tablea.'.id', $id)
            ->order_by($this->revision_table.'.revisions_number', 'asc')
            ->limit(1);
        $query = $this->db->get();
        if ($query->num_rows() > 0){
            return $query->row_array();
        }else{
            return 0;
        }
    }
}

现在方法 getRevisionKey() 应该产生如下查询

SELECT `tableb`.`revisions_number` as revisions_number FROM (`tableb`) WHERE `tableb`.`id` = '26' ORDER BY `tableb`.`revisions_number` asc LIMIT 1

但它会产生如下查询

SELECT `tableb`.`revisions_number` as revisions_number FROM (`tableb`) WHERE `id` = '26' AND `tableb`.`id` = '26' ORDER BY `tableb`.`revisions_number` asc LIMIT 1

这当然是由于在模型中调用了相同的方法,如果在模型之外使用此方法可以正常工作。这个问题有什么解决办法吗?

编辑 重写getRevisionKey() 解决了这个问题。这是新版本

    public function getRevisionKey($id){
        $sqlQuery = $this->db->select($this->revision_tablea.'.revisions_number as revisions_number')
            ->from($this->revision_tablea)
            ->order_by($this->revision_table.'.revisions_number', 'asc')
            ->limit(1);
        $query = $sqlQuery->where($this->revision_tablea.'.id', $id)->get();
        if ($query->num_rows() > 0){
            return $query->row_array();
        }else{
            return 0;
        }
    }

【问题讨论】:

  • 你在外部使用getRevisionKey()吗?我的意思是来自任何控制器?
  • 在我看来,问题出在上述方法中的$this->db->where('id', $id);,在我看来,除了下面正确的函数之外,它还添加了额外的参数。
  • @Aniket 我在控制器中使用它,并且正如预期的那样工作正常。
  • @MarioPeshev,你是对的。这个问题有什么解决办法吗?当然我可以做一些工作,但原来的问题仍然存在。
  • 我猜你在发帖之前做了一些修改?因为在getRevisionKey 中你调用$this->revision_tablea 但你定义$this->tablea 并且你有order_by($this->revision_table. 最后没有A 或B。我的意思是,我看不出有什么问题,但你有没有删掉一些可能导致问题的部分?

标签: php sql codeigniter query-builder


【解决方案1】:

这里有一个简单的技巧,可以准确地告诉你你在哪里犯了错误。 转到 system/database/DB_active_rec.php 从这些函数中删除 public 或 protected 关键字

public function _compile_select($select_override = FALSE)
public function _reset_select()

并保存它。在运行函数之前,我的意思是调用

$this->db->get() // Use $this->db->from() instead

使用

$query = $this->db->_compile_select()

并回显 $query;

这两个函数还有助于在 codeigniter 活动记录中进行子查询。 How can I rewrite this SQL into CodeIgniter's Active Records?

【讨论】:

  • CI 3.0 已公开所有编译方法。对调试非常有用。
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多