Миграции и начальные данные

Введение

Миграции - это что-то вроде системы контроля версий для вашей базы данных. Они позволяют команде программистов изменять структуру БД, в то же время оставаясь в курсе изменений других участников. Миграции обычно идут рука об руку с конструктором таблиц для более простого обращения с архитектурой вашего приложения.

Создание миграций

Для создания новой миграции вы можете использовать команду make:migration:

php artisan make:migration create_users_table

Миграция будет помещена в папку database/migrations и будет содержать текущее время, которое позволяет библиотеке определять порядок применения миграций.

Примечание: Старайтесь давать миграциям многословные имена - например, не comments, а create_comments_table - так вы избежите возможного конфликта названий классов.

Можно также использовать параметры --table и --create для указания имени таблицы и того факта, что миграция будет создавать новую таблицу, а не изменять существующую.

php artisan make:migration create_users_table --table=users --create

Применение миграций

Накатывание всех новых неприменённых миграций

php artisan migrate

Внимание: если при применении миграций вы сталкиваетесь с ошибкой "class not found" ("Класс не найден") - попробуйте выполнить команду composer dump-autoload.

Применение миграций на продакшне

Если ошибиться в написании миграций, то можно потерять данные в БД. Поэтому при применении миграций на рабочем сервере (рабочая среда по умолчанию, production) Laravel спрашивает подтверждения операции. Чтобы этого не происходило, например, для применения миграций в автоматическом режиме во время деплоя (загрузки) приложения на сервер, используйте ключ --force:

php artisan migrate --force

Откат миграций

Отмена изменений последней миграции

php artisan migrate:rollback

Отмена изменений всех миграций

php artisan migrate:reset

Откат всех миграций и их повторное применение

php artisan migrate:refresh

php artisan migrate:refresh --seed

Загрузка начальных данных в БД

Кроме миграций, описанных выше, Laravel также включает в себя механизм наполнения вашей БД начальными данными (seeding) с помощью специальных классов. Все такие классы хранятся в database/seeds. Они могут иметь любое имя, но вам, вероятно, следует придерживаться какой-то логики в их именовании - например, UserTableSeederи т.д. По умолчанию для вас уже определён класс DatabaseSeeder. Из этого класса вы можете вызывать метод call для подключения других классов с данными, что позволит вам контролировать порядок их выполнения.

Примерные классы для загрузки начальных данных

class DatabaseSeeder extends Seeder {

    public function run()
    {
        $this->call('UserTableSeeder');

        $this->command->info('Таблица пользователей заполнена данными!');
    }

}

class UserTableSeeder extends Seeder {

    public function run()
    {
        DB::table('users')->delete();

        User::create(array('email' => 'foo@bar.com'));
    }

}

Для добавления данных в БД используйте артизан-команду db:seed:

php artisan db:seed

По умолчанию команда db:seed запускает метод run() класса DatabaseSeeder. В этом методе вы можете вызывать другие ваши сидеры. Или, вы можете задать название класса, который будет вызван вместо дефолтного:

php artisan db:seed --class=UserTableSeeder

Вы также можете заполнить БД первоначальными данными командой migrate:refresh, которая перед этим откатит и заново применит все ваши миграции:

php artisan migrate:refresh --seed