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

3 回答 3

2

您可以使用__setand__get魔术方法并重载模型,这实际上并不难,但是如果 CI_Model 正在使用这些魔术方法并且您将覆盖它们,则可能会出现问题......

如果您想使用set_variable,请执行以下操作:

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

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

于 2013-05-11T03:31:25.327 回答
2

不幸的是,CI 不允许您在加载模型时发送构造函数参数。这是不幸的,因为您的用例非常适合。表名对模型至关重要,因此如果不指定表名,您应该无法初始化模型。在 CI 的当前版本之前,如果不修改核心文件,这是不可能的。如果您愿意这样做,请参阅此处

您的另一个更干的选择是initialize()向 MY_Model 添加一个方法。必须在模型可用之前调用初始化方法。

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);
于 2013-05-11T03:39:08.053 回答
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);
    }
}
于 2013-05-11T04:16:04.323 回答