2013-05-11 84 views
0

我有了所有常見的數據庫的功能,如一個型號:傳遞變量從控制器到模型(即延伸其它模型)笨

class MY_Model extends CI_Model { 
    public $table; 
    function __construct() 
    { 
     parent::__construct(); 
    $this->load->database();   
    } 
    function insert($data) { 
     $this->db->insert($this->table,$data); 
     return $this->db->insert_id(); 
    } 
    function update($where=array(),$data) { 
     $this->db->update($this->table,$data,$where); 
     return $this->db->affected_rows(); 
    } 
    function delete($where=array()) { 
     $this->db->delete($this->table,$where); 
     return $this->db->affected_rows(); 
    } 
    //ETC. 

} 

現在,我具有延伸它的模型,所以在構造我定義我想使用哪個表:

class other_model extends MY_Model { 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->database();   
     $this->table = 'MY_TABLE';  
    } 
} 

而在控制器我只想做:

$this->load->model('other_model'); 
$id_affected = $this->other_model->insert(...); 

現在,我想利用這個代碼的優勢,並重新使用它,所以我想使表名變量,從控制器傳遞到這個模型,如:

$this->load->model('other_model'); 
$table_name = 'TABLE_1' 
$this->other_model->set_variable($table_name); 
$id_affected = $this->other_model->insert(...); 

有沒有辦法做到這一點? 我嘗試:

型號:

class other_model extends MY_Model { 
    var $variable; 

    function __construct() { 
     parent::__construct(); 
     //tried here 
     //$this->load->database();  
    //$this->table = $variable; 

    } 

    function set_variable($variable) { 
     $this->variable = $variable; 

     //also tried here 
     //$this->load->database();  
    //$this->table = $variable; 
    } 

} 

控制器:

class test extends CI_Controller { 
    function tester() { 
     $this->load->model('other_model'); 
     $variable = 'MY_TABLE_1' 
     $this->other_model->set_variable($variable); 
    } 
} 

回答

2

不幸的是CI不允許你加載模型時發送構造函數的參數。這是不幸的,因爲你的用例對此非常完美。表格名稱對模型非常重要,所以如果不指定表格名稱,就不應該能夠初始化模型。直到當前版本的CI,這是不可能的,沒有修改核心文件。如果你願意這樣做,see here

您的其他選項,更乾燥的是添加一個initialize()方法MY_Model。在模型可用之前,必須調用initialize方法。

class MY_Model { 
    $this->table = NULL; 

    public function initialize($tbl) { 
    $this->table = $tbl; 
    } 

    // sample use 
    public function insert($obj) { 
    if ($this->table !== NULL) { 
     // insert 
    } 
    } 

} 

控制器代碼應該是這樣的:

// other_model extends MY_Model 
$this->load->model('other_model'); 
$this->other_model->initialize('user_table'); 
$this->other_model->insert($obj); 
2

您可以使用__set__get魔術方法和重載模式,這實在不是那麼難做到,但如果這些神奇的方法正在被CI_Model使用,並且您將覆蓋它們,則會出現問題...

如果喲ü要使用set_variable,做這樣的事情:

function set_variable($var,$val){ 
    $this->$var=$val; 
} 

然後,你可以做$this->other_model->set_variable('table','MY_TABLE_1');

+1

因此控制器會是這樣:'$這 - >負載>模型( 'other_model'); $ this-> other_model-> set_variable('table','MY_TABLE_1');'? – cMinor 2013-05-11 03:46:28

+0

是。據我所知,這將完成工作。當然沒有測試過。 – 2013-05-11 03:47:06

+0

和模型'var $ variable;函數__construct(){ parent :: __ construct(); } function set_variable($ var,$ val){ $ this - > $ var = $ val; }}' – cMinor 2013-05-11 03:47:30

1

試試這個,沒有必要因爲它的父類已經加載到子類再次裝入數據庫,我也想你應該改變所述public $tableprotected $table;

class MY_Model extends CI_Model { 
    protected $table; 
    function __construct(){ 
     parent::__construct(); 
     $this->load->database();   
    } 

    function insert($data) { 
     $this->db->insert($this->table,$data); 
     return $this->db->insert_id(); 
    } 

    // ... 
} 

class Other_Model extends MY_Model { 
    function __construct(){ 
     parent::__construct(); 
    } 

    function set_table($table){ 
     $this->table=$table; 
    } 

    function get_table(){ 
     return $this->table; 
    } 
} 

class Tester extends CI_Controller { 

    public function __construct(){ 
     parent::__construct(); 
    } 

    public function test() { 
     $this->load->model('Other_Model'); 
     $this->Other_Model->set_table('MY_TABLE_1'); 
     $data = array(...); 
     $this->Other_Model->insert($data); 
    } 
} 
+0

我試過了,但有錯誤... – cMinor 2013-05-11 04:30:32

+0

你有什麼錯誤,我已經測試了這個代碼,然後發佈它。 – 2013-05-11 04:31:18

相關問題