Как удалить все таблицы в Codeigniter с помощью библиотеки миграции

#php #codeigniter-3 #database-migration

#php #codeigniter-3 #база данных-миграция

Вопрос:

Я создал файлы миграции в Codeigniter 3 для базы данных, используя Migration библиотеку, предоставленную CI, и с помощью онлайн-руководств. Мой файл миграции выглядит следующим образом,

 <?php

class Migration_Leave_tracker extends CI_Migration {

    public function up() {
        $this->dbforge->add_field(array(
            'id' => array(
                'type' => 'INT',
                'constraint' => 11,
                'auto_increment' => TRUE
            ),
            'emp_id' => array(
                'type' => 'INT',
                'constraint' => 11,
            ),
            'start_date' => array(
                'type' => 'DATE',
            ),
            'end_date' => array(
                'type' => 'DATE',
            ),
            'created_date' => array(
                'type' => 'DATETIME',
            ),
        ));
        $this->dbforge->add_key('id', TRUE);
        $this->dbforge->create_table('leave_tracker');
    }

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

}
  

Здесь вы можете видеть, что в моем файле миграции есть два метода, один up() из которых используется для создания таблицы, а другой down() — для удаления таблицы.

У меня есть другой контроллер с методом для запуска миграции,

 public function migrate($version = null) {
        $this->load->library('migration');

        if ($version != null) {
            if ($this->migration->version($version) === FALSE) {
                show_error($this->migration->error_string());
            } else {
                echo "Migrations run successfully" . PHP_EOL;
            }

            return;
        }

        if ($this->migration->latest() === FALSE) {
            show_error($this->migration->error_string());
        } else {
            echo "Migrations run successfully" . PHP_EOL;
        }
    }
  

Согласно документации CI, этот фрагмент кода создаст все миграции, и я предполагаю, что под капотом он вызовет up() метод всего класса migrations для создания таблиц.

Теперь мой вопрос в том, как я могу создать метод, который удалит все таблицы в базе данных, используя drop() метод класса миграции. Я не смог найти никаких ссылок на это в документах.

Комментарии:

1. Обычно файл миграции удаляет только таблицы (in down() ), которые были созданы в классе up() .

2. @ DFriend это все, что я хочу, но вопрос в том, как это сделать.

3. Я был смущен вашим заявлением «… удалит все таблицы в базе данных «. (Выделение мое) Я нашел способ сделать это, но это было некоторое время назад. Я поищу код, когда позволит время, и поделюсь им здесь. Может потребоваться день или два,

Ответ №1:

Я использовал следующий контроллер миграции с хорошими результатами.

 class Migrator extends CI_Controller
{
    public function __construct($config = array())
    {
        parent::__construct($config);
        $this->load->library('migration');
    }

    public function migrate($version = NULL)
    {

        $outcome = $this->migration->version($version);

        if(is_string($outcome))
        {
            echo "Migration to version $outcome succeeded.";
        }
        elseif($outcome === TRUE)
        {
            echo "No migration was possible. Target version is the same as current version.";
        }
        else
        {
            echo $this->migration->error_string();
        }
    }

    public function latest() //you could this for migration::current() too
    {
        $this->migration->latest();
    }

}
  

Предполагая использование «последовательного» номера при миграции и class Migration_Leave_tracker находится в файле 001_Migration_Leave_tracker.php

Затем http://example.com/migrator/migrate/1 запустится просмотр Migration_Leave_tracker::up() .

Чтобы вернуться к этому, просто вызовите migrate с меньшим порядковым номером, например. http://example.com/migrator/migrate/0 что приведет к вызову Migration_Leave_tracker::down()`. (По крайней мере, для меня это так.)

Нумерация временных меток также работает, но для «окончательного удаления» используйте ноль в качестве аргумента URL. Другими словами, просто используйте http://example.com/migrator/migrate/0 , как было сделано для последовательной нумерации.

Комментарии:

1. Спасибо за помощь, это сработало. Я не знал, что если указать 0 в качестве версии миграции, то таблица будет удалена.

2. Это не задокументировано, но, вероятно, должно быть.