#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. Это не задокументировано, но, вероятно, должно быть.