1

同じモデル内でモデル メソッドを呼び出そうとしていますが、意図したとおりに機能しません。これが機能しない2つのメソッドを持つ私のクラスです

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;
        }
    }
4

1 に答える 1

0

これは、どこで間違いを犯しているのかを正確に教えてくれる簡単なハックです。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; をエコーし​​ます。

これら 2 つの関数は、codeigniter アクティブ レコードのサブクエリにも役立ちます。 この SQL を CodeIgniter のアクティブ レコードに書き直すにはどうすればよいですか?

于 2012-06-15T05:58:18.457 に答える