Codeigniter Migration无法重新声明类

时间:2013-08-31 08:01:40

标签: codeigniter database-migration

我正在尝试将重置功能添加到codeigniter的迁移中。以下是我的代码:

class Migration extends Backend_Controller {

  public function __construct()
  {
    parent::__construct();
    $this->load->library('migration');
  }

  public function index()
  {
    //...
  }

  public function reset()
  {
    $this->migration->version(1);
    $this->db->truncate('ci_sessions'); 
    $this->migration->current();
  }

}

它返回错误:

Fatal error: Cannot redeclare class Migration_Create_geo_data in D:\web_projects\vProject\framework\application\migrations\002_create_geo_data.php on line 44

如果我单独运行它们,一切都没问题。在一起时它会给出错误。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

最有可能的是,此错误是由于将迁移设置为创建表(如果它们尚不存在)并且缓存数据未立即更新而导致的。

您的迁移脚本调用DB_forge::create_table方法,该方法有两个参数。参数一是表名,参数二是可选的。它是if_not_exists标志。但是默认值为false;如果设置为true,则只有在尚未存在时才会创建表。

如果您的表是在if_not_exists参数设置为 false 的情况下创建的,则缓存问题(可能)永远不会发生:

$this->dbforge->create_table('table_name');

如果在if_not_exists参数设置为 true 的情况下创建表格,则需要在重新加载迁移时强制缓存更新。

$this->dbforge->create_table('table_name', TRUE);

以下是一些可以避免此问题的选项:

  1. 仅将表名作为参数发送到create_table方法
  2. data_cache['table_names']致电
  3. 后取消设置migration->version(0)

    如果您选择选项2,这是一个有效的方法:

    public function reset() {
        $this->load->library('migration');
    
        if (!$this->migration->version(0)) {
            echo $this->migration->error_string();
        }
    
        // unset table cache - this will force it to update
        unset($this->db->data_cache['table_names']);
    
        if (!$this->migration->current()) {
            echo $this->migration->error_string();
        }
    }
    

    除此之外,迁移文件也会自动加载并保存在会话中。 我在system / libraries / Migration.php:include $f[0];中将此行更改为include_once $f[0];

答案 1 :(得分:1)

最有可能的是,您通过复制/粘贴从早期版本进行迁移。现在有两个迁移文件,声明了相同的类

即,

class Migration_Add_blog extends CI_Migration

在两个文件中