Миграции Codeigniter + Несколько таблиц + Один файл миграции на таблицу - PullRequest
3 голосов
/ 29 марта 2012

Я хочу начать использовать DBForge и класс миграции, встроенный в CI, но я не уверен, как создать миграцию для всех моих таблиц.

Я думаю, что в процессе установки у меня есть файл миграции для каждой из следующих таблиц: advertisements, announcements, config, users, points .. Когда пользователь устанавливает приложение, оно автоматически запускает эти файлы миграции и создает таблицы.

IE: 001_advertisements, 001_announcements, 001_config, 001_users, 001_points

001_map_advertisements

class Migration_map_advertisements extends CI_Migration {

public function up(){
    $this->dbforge->add_field(array(
        'id' => array(
            'type' => 'INT',
            'constraint' => 11,
            'unsigned' => TRUE,
            'auto_increment' => TRUE
        ),
        'youtube_id' => array(
            'type' => 'VARCHAR',
            'constraint' => '255',
        ),
        'status' => array(
            'type' => 'int',
            'constraint' => 11,
            'null' => FALSE,
            'default' => 1
        ),
        'timestamp' => array(
            'type' => 'int',
            'constraint' => 11
        ),
        'type' => array(
            'type' => 'VARCHAR',
            'default' => 'video'
        ),
        'filename' => array(
            'type' => 'VARCHAR',
            'constraint' => '255'
        ),
        'url' => array(
            'type' => 'varchar',
            'constraint' => '255'
        ),
        'description' => array(
            'type' => 'varchar',
            'constraint' => 64
        ),
        'title' => array(
            'type' => 'varchar',
            'constraint' => 64
        )
    ));
    $this->dbforge->create_table('map_advertisements', TRUE);
}

public function down()
{
    $this->dbforge->drop_table('map_advertisements');
}

Однако, если я сделаю это и попытаюсь запустить защищенный контроллер:

class Developer extends ADMIN_Controller {
function __construct(){
    parent::__construct();
} #end constructor function
public function migrate($index){
    $this->load->library('migration');

    if ( !$this->migration->version($index) ){
        show_error($this->migration->error_string());
    }else{
        echo 'migrated';
    }

}
}

Я получаю сообщение о том, что существует несколько version 1 миграций, и он не проходит процесс миграции. Есть ли другой способ сделать это в CI?

Ответы [ 2 ]

7 голосов
/ 29 марта 2012

Да, у вас может быть только один файл миграции на версию.Миграция не зависит от таблицы, но больше похожа на «какие изменения схемы необходимы для перехода с версии x на версию x + 1 моего приложения?»

Объедините все существующие файлы миграции в 1 и введите имяэто что-то вроде 001_initial_schema.php.Затем при добавлении новой функции создайте новый файл схемы для этой функции.Если у вас есть цикл развертывания (например, еженедельные спринты SCRUM), было бы неплохо иметь один из этих файлов миграции на развертывание.

1 голос
/ 07 июля 2015

Согласно http://www.codeigniter.com/user_guide/libraries/migration.html, лучший способ «версии» ваших миграций - использовать формат ГГГГММДДЧЧММСС. Это должно эффективно преодолеть проблемы с версиями, как они были выражены. Также предлагается, чтобы, если имя файла было «201507071208_advertisements.php», то содержащийся класс миграции должен называться «Migration_Advertisements».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...