【问题标题】:Codeigniter Datamapper - Add tablename by __constructCodeigniter Datamapper - 通过 __construct 添加表名
【发布时间】:2012-10-18 14:14:21
【问题描述】:

在我的 CMS 中,我想通过在数据库中创建一个表来添加模块。但是带有数据映射器的 Codeigniter 有一个强制性规则:在代码中给出表名。我创建了一个 Datamapper 模型如下:

class Module_universeel extends DataMapper {

    public $table = 'module_universeel';
    public $has_one = array('page');

    public function __construct($module_table=null) {

        parent::__construct();
        if(isset($module_table)) $this->table = $module_table;

    }
}

这在我创建一个名为“module_universeel”的表时有效。当我将表名更改为“module_news”或其他内容时,它可以工作。但它不会改变我的数据映射器的结构($this->fields)。

我该怎么做?有人有这方面的经验吗?

【问题讨论】:

    标签: codeigniter codeigniter-datamapper


    【解决方案1】:

    Datamapper 缓存表定义,由配置属性“production_cache”控制。

    如果启用缓存,则不会在每次页面加载时都查询该表,而是使用缓存的信息。

    【讨论】:

      【解决方案2】:

      因为this->fields 数组被填充到parent::__construct(); 中,此时表名仍然是module_universeel

      试试这个:

      if(isset($module_table)) $this->table = $module_table;
      parent::__construct();
      

      【讨论】:

      • 那也行不通。它不会更改我的表的名称(当我打印它时)。
      【解决方案3】:

      我有办法。我将此添加到我的数据映射器模型中:

      
      
          public function updateTableFields(){
                  $this->fields = array();
                  $data_fields = $this->db->field_data($this->table);
                  foreach ($data_fields as $data_field){
                      $this->fields[] = $data_field->name;
                      $this->stored->{$data_field->name} = "";
                  }
      
              }
      
      

      我将它添加到我的构造函数中:

      $this->updateTableFields();

      现在我成功地改变了结构。谢谢你帮助我!

      【讨论】:

        猜你喜欢
        • 2016-10-22
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多