将变量从控制器传递给模型(扩展其他模型)codeigniter

时间:2013-05-11 03:14:52

标签: php codeigniter

我的模型具有所有常见的数据库功能,如:

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

3 个答案:

答案 0 :(得分: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 :(得分:2)

不幸的是,CI不允许您在加载模型时发送构造函数参数。这很不幸,因为您的用例非常适合。表名对于模型至关重要,因此您无法在未指定表名的情况下初始化模型。直到当前版本的CI,如果不修改核心文件,这是不可能的。如果您愿意,see here

你的另一个更干的选择是向MY_Model添加initialize()方法。必须在模型可用之前调用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 :(得分:1)

试试这个,不需要在子类中再次加载数据库,因为它已经加载到父类中,我认为你应该将public $table更改为protected $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);
    }
}