我正在尝试将重置功能添加到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
如果我单独运行它们,一切都没问题。在一起时它会给出错误。有什么想法吗?
答案 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);
以下是一些可以避免此问题的选项:
create_table
方法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];
答案 1 :(得分:1)
最有可能的是,您通过复制/粘贴从早期版本进行迁移。现在有两个迁移文件,声明了相同的类
即,
class Migration_Add_blog extends CI_Migration
在两个文件中