1

我正在尝试将重置功能添加到 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

如果我单独运行它们,一切都很好。当在一起时,它会产生错误。任何想法?

4

2 回答 2

2

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

您的迁移脚本调用DB_forge::create_table采用两个参数的方法。参数一是表名,参数二是可选的。它是if_not_exists旗帜。然而,默认值为 false;如果将其设置为 true,则仅当它们不存在时才会创建表。

如果您的表是使用设置为falseif_not_exists的参数创建的,则缓存问题将(可能)永远不会发生:

$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']后取消设置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];

于 2014-03-22T02:27:49.427 回答
1

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

IE,

class Migration_Add_blog extends CI_Migration

在两个文件中

于 2013-09-01T05:51:16.510 回答