我的模型具有所有常见的数据库功能,如:
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);
}
}
答案 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);
}
}