2013-08-31 105 views
1

我正在嘗試將重置函數添加到codeigniter的遷移。下面是我的代碼: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 

如果我seperately運行它們,一切都還好。一起發生錯誤。任何想法?

+0

可以詳細說明並檢查任何重新聲明。 –

+0

@VJSai其實我有4個遷移文件'001 _...'到'004 _...',我有不同的名字和適當的類名。如果我只運行一個命令,我可以運行' - > version(1)'或' - > current()'沒有任何錯誤。當我嘗試在同一個函數中運行多個遷移命令時,它會發生錯誤。 – YahyaE

回答

1

最有可能的,您可以通過複製/粘貼從較早的一個&做出遷移現在有兩個遷移文件與聲明的同一類

class Migration_Add_blog extends CI_Migration 

兩個文件

2

很可能,這個錯誤是由於您的遷移設置爲創建表(如果它們尚不存在且AND緩存數據未立即更新)的結果。

您的遷移腳本調用了帶有兩個參數的DB_forge::create_table方法。參數一是表名,參數二是可選的。這是if_not_exists標誌。但是,默認值爲false。如果它被設置爲真,表只有在它們不存在的情況下才會被創建。

如果你的表與if_not_exists參數集創建緩存問題將(可能)不會發生:

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

如果表與if_not_exists參數設置爲創建的,你在重新加載遷移時需要強制更新緩存。

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

這裏有幾個選項來避免這個問題:

  1. 只有migration->version(0)通話後發送表名作爲參數傳遞給create_table方法
  2. 取消設置data_cache['table_names']

如果您選擇選項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(); 
    } 
} 

除此之外,遷移文件被自動加載和保存在會話。 我在系統/庫/ Migration.php中更改了這一行:include $f[0];include_once $f[0];