2015-11-03 70 views
0

我正在一個應用程序中,我需要在飛行中創建數據庫表,我這樣做。但是現在我需要一種優雅的方式來訪問數據庫表。所以這裏是我的問題Codeigniter 3創建動態方法

在常規實踐中,我們創建一個數據庫表並創建一個類來映射表(ORM)。但在這種情況下我不能採取這種方法。這是我到目前爲止所做的。

我擴展了Crud模型中的MY_Model,我嘗試在set_table()方法中設置數據庫表名。它工作正常。

class Crud extends MY_Model 
{ 

    private $customer_id; 

    public function __construct() 
    { 

     parent::__construct(); 

     $this->_database = $this->load->database('customer', TRUE); 
    } 


    public function set_table($customer_id, $table_name) 
    { 
     $this->customer_id = $customer_id; 
     $this->_table = 'tbl_' . $customer_id . '_' . $table_name; 
    } 
} 

Test.php控制器測試代碼。

class Test extends CI_Controller 
{ 

    public function index(){ 

     $this->load->model('editor/crud'); 

     var_dump($this->crud->set_table(1, 'alpha')); 
     var_dump($this->crud->get_all()); 
    } 
} 

但我需要一個優雅的方式來訪問表。例如。

$this->alpha->get_all() 

OR

$this->crud->alpha->get_all()

會很容易理解&就會使多大意義。它實際上可以在PHP中做到嗎?任何幫助將是非常可觀的。

回答

0

我猜你可以這樣做:

class Test extends CI_Controller 
{ 

    public function index(){ 

     $this->load->model('editor/crud'); 
     $this->crud->set_table(1, 'alpha'); 

     $this->alpha = clone $this->crud; // in case you use set_table again 

     $info = this->alpha->get_all(); 

    } 
} 

如果我沒有記錯,你應該能夠做到這一點的模型了。

public function set_table($customer_id, $table_name) 
{ 

    $this->customer_id = $customer_id; 
    $this->_table = 'tbl_' . $customer_id . '_' . $table_name; 
    $this->{$table_name} = clone $this; 
} 

然後像這樣訪問它:$this->crud->alpha->get_all();

+0

是否可以改變模型?我需要將它封裝在模型中。 – Fawzan