2012-06-14 4 views
1

Я пытаюсь вызвать метод модели внутри той же модели и не работать должным образом. Вот мой класс с двумя методами, которые не работаютCodeigniter - вызов метода модели в пределах одной модели является ошибкой

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 

опшена конечно, из-за того, что тот же метод вызывается внутри модели, этот метод работает отлично, если используется вне модели. Любое решение этой проблемы?

EDIT Переписывание 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; 
     } 
    } 
+0

Вы используете 'getRevisionKey()' извне? Я имею в виду от любого контроллера? – Aniket

+0

На мой взгляд, проблема заключается в том, что '$ this-> db-> где ('id', $ id);' в методе, указанном выше, мне кажется, что он добавляет дополнительный параметр в дополнение к функции, ниже которой правильно , –

+0

@Aniket Я использую это в контроллере, и, как и ожидалось, он отлично работает. – Kumar

ответ

0

Вот простой взлом, который даст вам именно то, где вы делаете ошибку. Перейти системы/базы данных/DB_active_rec.php Удалить публичный или защищенный ключевое слово из этих функций

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

И сохранить его. Перед запуском функции я имею в виду вызова

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

использование

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

и эхо $ запроса;

Эти две функции также помогают в подзапросе в активной записи codeigniter. How can I rewrite this SQL into CodeIgniter's Active Records?

+0

CI 3.0 сделал все методы компиляции общедоступными. Очень полезно для отладки. – xbonez