Сайт-визитка на Laravel. Этап 5 – создание таблиц в базе данных

Сегодня поговорим о миграциях.

В старых фреймворках работа с таблицами и заполнением начальными данными лежала полностью на плечах разработчика. И он создавал таблицы и устанавливал связи между ними либо в графическом интерфейсе специальных программ для разработки баз данных типа 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

Кто не знает:

  • ключ artisan list выводит все команды artisan, что очень полезно.
  • ключ artisan <command> --help (или -h) выводит краткую справку по команде

Вот как раз по нужной нам команде справка.
artisan-migration

Генерируем файл миграции

Можно просто задать миграцию, а можно задать миграцию со всеми полями. Второй вариант быстрее, но я буду описывать каждое поле, так что пойду по первому варианту:

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:

  1. ID страницы, он же и первичный ключ таблицы, должен быть уникальный, автоувеличение
  2. Название страницы, которое будет отображаться пользователю
  3. Название страницы для меню
  4. Псевдоним страницы для ЧПУ, уникальное
  5. Описание страницы (meta description)
  6. Ключевые поля страницы (meta keywords)
  7. Картинка страницы (для микроразметки)
  8. Статья (наполнение страницы)
  9. Дата создания
  10. Дата редактирования
  11. Статус страницы

Пункт 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 или заполнение данными таблицы.

Ссылка на основную публикацию