Сегодня поговорим о миграциях.
В старых фреймворках работа с таблицами и заполнением начальными данными лежала полностью на плечах разработчика. И он создавал таблицы и устанавливал связи между ними либо в графическом интерфейсе специальных программ для разработки баз данных типа MySQL Workbench, либо руками через запросы на языке sql в спецпрограммах типа HeidiSQL, либо в веб-интерфейсе phpMyAdmin, либо вообще в командной строке.
Пока разработчик один, такие инструменты справляются со своими обязанностями хорошо. Но когда разработчиков несколько, проект уже в продакшене на сервере, то возникает проблема с версиями базы данных: один разработчик добавил поле, а другой другое. И как теперь все это совместить?
В Laravel (да и в других современных фреймворках) версионность реализуется через механизм миграций. Миграциии – это способ централизованно управлять таблицами базы данных приложения.
То есть создается файлы таблиц, которые создают, изменяют структуры таблиц по времени и из одного интерфейса. Всегда можно откатиться назад на несколько шагов. Так что работа в команде над проектом становится легче и удобнее.
А на продакшене можно создавать миграции с изменением структуры таблицы для добавления некоторых дополнительных полей.
Сложностей с миграциями нет никаких – все очень подробно расписано в инструкциях даже на русском языке. Повторять я их не буде, читайте самостоятельно.
Перейдем к практике.
Миграция для статических страниц
Нам нужно создать простую таблицу для хранения данных о каждой статической страницы с текстом. Назовем её по правилам pages без всяких префиксов во множественном числе (чуть подробнее об этом расскажу, когда перейдем моделям).
Для начала, нужно определиться со структурой такой таблицы.
Таблица у нас будет одна, и она простая – нет никаких отношений «один-ко многим» и «многие-ко многим». Так что будем писать её с ходу.
Перед работой нужно сгенерировать файл, где мы будет проектировать структуру таблицы. Это делается в командной строке при помощи команд artisan.
Пакет «way/generators»
Artisan может генерировать файлы миграций, выполнять некоторые вспомогательные вещи. Для расширения его возможностей придумали пакет, которые расширяют возможности artisan как генератора файлов. Давайте его установим, он нам не раз понадобится.
В файле composer.json в секцию «require» дописываем строчку:
"way/generators": "2.6.1",
И в командной строке обновляем проект через composer:
composer update
В файле настройке app/config/app.php
в секции ‘providers’ прописываем
'Way\Generators\GeneratorsServiceProvider',
Теперь проверяем подхватились ли новые команды artisan:
Php artisan list
Как видите, появились новая секция generate, где теперь находится много новых и полезных команд.
Кто не знает:
- ключ
artisan list
выводит все команды artisan, что очень полезно. - ключ
artisan <command> --help
(или -h) выводит краткую справку по команде
Вот как раз по нужной нам команде справка.
Генерируем файл миграции
Можно просто задать миграцию, а можно задать миграцию со всеми полями. Второй вариант быстрее, но я буду описывать каждое поле, так что пойду по первому варианту:
php artisan generate:migration create_pages_table
В папке app/database/migrations
создается файл вида 2015_04_08_160323_create_pages_table.php
. Где первые числа — это дата, а далее описывается (вами) что она должна делать. Дата очень важна, ведь иначе как будет понятно Laravel что сначала, а что потом.
Файл миграции
Рассмотрим этот сгенерированный файл миграций. Пока он небольшой, приведу его полностью:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; class CreatePagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('pages', function(Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('pages'); } }
Как видите, это простой класс с двумя методами: up и down. В первом создается таблица, а второй нужен для отката изменения (обычно там удаляется таблица).
Сам класс использует для генерации таблицы класс Scheme
Пакет Way/Generators делает черновое наполнение, чтобы руками его не писать. В стандартной команде migrate:make кроме объявления класса и методов ничего, нет и возможности дополнительного задания полей на этапе генерации.
В этом файле теперь и будем работать.
Таблица для статических полей
Подготовительную работу выполнили, теперь будем думать о том, какие поля мне необходимы для генерации страницы, в том числе и для SEO:
- ID страницы, он же и первичный ключ таблицы, должен быть уникальный, автоувеличение
- Название страницы, которое будет отображаться пользователю
- Название страницы для меню
- Псевдоним страницы для ЧПУ, уникальное
- Описание страницы (meta description)
- Ключевые поля страницы (meta keywords)
- Картинка страницы (для микроразметки)
- Статья (наполнение страницы)
- Дата создания
- Дата редактирования
- Статус страницы
Пункт 3 немного спорный – про меню пока не думал, но пусть будет.
Перенесем эти поля теперь в файл миграций:
Schema::create('pages', function(Blueprint $table) { $table->increments('id'); $table->string('title'); $table->string('menu'); $table->string('slug')->unique(); $table->string('description'); $table->string('keywords'); $table->string('image'); $table->string('status'); $table->text('body'); $table->timestamps(); });
Как видите, все понятно. Первое поле сгенерировано и будет приниматься системой как ключевое, уникальное и с автоувеличением. Без этого поля не будет вообще создаваться таблица. $table->timestamps();
— эта команда тоже генерируется автоматом и она говорит Laravel создать два поля с датой создания записи и датой редактирования. Остальное – полностью ваше творчество.
Если вам нужно что-то особенное, то можете посмотреть на официальном сайте документацию. Именно на официальном – она более полная. С другой стороны, там есть раздел API, где расписаны тонкости Laravel. Только следите за версией.
Вот страница по Scheme Builder для создания таблиц миграций с примерами и подробным описанием.
Запуск миграции
Нам остается только запустить миграцию. В командной строке
php artisan migrate
И у нас в базе создается две таблицы: migrations и pages. В папке migrations хранятся лог всех изменений таблиц. Благодаря этому можно откатывать назад миграции. Ну и вторая таблица нужная нам для хранения данных статических страниц.
Если что-то хотим откатить, то нужно ввести команду для отката последнего изменения
migrate:rollback
, а для полного удаления всех миграций migrate:reset
.
Заключение
В Laravel работа с базой данных разделена на 3 этапа: создания таблицы (migration), заполнение данными (seeding) и получение/обновление/удаление данных через модель. Первый этап пройден, в следующей статье разберем seeding или заполнение данными таблицы.