2015-11-03 3 views
0

Я работаю в приложении, где мне нужно создавать таблицы базы данных «на лету», я сделал это. Но теперь мне нужен элегантный способ доступа к таблицам базы данных. Итак, вот моя проблемаCodeigniter 3 create dynamic methods

В обычной практике мы создаем таблицу базы данных и создаем класс для сопоставления таблицы (ORM). Но я не могу принять такой подход в этом случае. Это то, что я сделал до сих пор.

Я расширяю MY_Model в модели Crud, я пытаюсь настроить имя таблицы базы данных в методе 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 для проверки кода.

Но мне нужен элегантный способ доступа к столу. например.

$this->alpha->get_all() 

ИЛИ

$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