Может войдёшь?
Черновики Написать статью Профиль

Миграции

перевод

  1. 1. Настройка БД
  2. 2. Миграции

Миграции — одна из наиболее моих любимых возможностей в Laravel. Я очень не люблю писать SQL — и класс PHPSchema позволяет создавать нужные мне таблицы даже не вспоминая об этом пресловутом «языке программирования». Кроме того, код, использующей PHPSchema очень красив и читается так же просто, как обычный связный текст.

Если вы до сих пор не сталкивались с миграциями — это просто способ описать в одном файле изменения вашей базы данных — при этом разные установки или копии разработки проекта будут их учитывать. Изменения структуры могут быть откачены («rolled back»). Кроме этого, миграции могут использоваться для заполнения таблиц начальными данными (это ещё называют «посевом»«seeding»).

Настройка БД

Первым делом направляйтесь к файлу application/config/database.php — если вы когда-либо устанавливали PHP-приложение, то вам знаком этот формат. У вас ведь есть данные подключения к вашей базе данных? Если нет — самое время их откопать!

Ну что, вы вернулись? Отлично, продолжим.

Прокрутите содержимое этого файла к массиву connections — здесь размещены настройки для различных типов баз данных. Внесите свои настройки в нужный тип, а я тем временем разберусь со своей старомодной MySQL:

PHP
'mysql' => array(
  
'driver' => 'mysql',
  
'host' => 'localhost',
  
'database' => 'codefun',
  
'username' => 'root',
  
'password' => 'pandaseatbamboo',
  
'charset' => 'utf8',
  
'prefix' => '',
),

Вот и всё, теперь вам осталось прокрутить файл немного выше и установить ключ default в тип используемой БД — в моём случае это MySQL:

PHP
'default' => 'mysql',

Наша БД сконфигурирована и теперь нам нужны таблицы, с которыми можно было бы поразвлечься. Впёрёд, к миграциям!

Миграции

Начнём с создания файла миграции.

Для создания новой миграции нам понадобится интерфейс командной строки Laravel — «Artisan». Чтобы запустить его вам нужен установленный PHP CLI — обычно он идёт в комплекте с вёб-сервером. Откроем командную строку в папке установки Laravel (там, где содержится файл artisan) и выполним нашу первую команду:

shphp artisan migrate:make create_users

Мы просим Artisan выполнить метод make задания migrate, которому мы передаём имя нашей миграции. Я обычно называю миграцию по действию, которое оно выполняет — в нашем случае мы будем создавать таблицу пользователей (users).

Посмотрим, что получилось:

Great! New migration created!

Какой жизнерадостный ответ! Посотрим, что произошло в папке application/migrations — здесь появился новый файл 2012_03_30_220459_create_users.php — хотя ваш будет называться как-то иначе. Как вы уже заметили, Artisan добавляет к имени файла текущую дату и время в формате His — причина этого в важности дат для миграций (как, впрочем, и для людей), потому что только так система может определить, в каком порядке они должны выполняться.

Откроем появившийся файл и посмотрим, что он из себя представляет:

PHP
class Create_Users {
  
/**
  * Внести изменения в базу данных.
  *
  * @return void
  */
  
public function up()
  {
    
//
  
}

  
/**
  * Отменить изменения базы данных.
  *
  * @return void
  */
  
public function down()
  {
    
//
  
}
}

Как вы видите, наш класс миграции содержит два метода: up() для изменения базы данных и down() для их отмены — благодаря ему миграцию можно применить, а затем откатить при необходимости. Например, если мы создаём таблицу в методе PHPup(), то в PHPdown() нам нужно будет её удалить.

Так как же нам внести изменения в нашу БД — наверное, не обойдётся без «красивых» SQL-запросов? На самом деле нет — ведь мы используем Laravel, поэтому если оно «красиво», то вы не найдёте этого во фреймворке. Посмотрим, как это делается при использовании класса Schema:

PHP
Schema::create('users', function ($table) {
  
// auto incremental id (PK)
  
$table->increments('id');

  
// varchar 32
  
$table->string('username'32);
  
$table->string('email'320);
  
$table->string('password'64);

  
// int
  
$table->integer('role');

  
// boolean
  
$table->boolean('active');

  
// created_at | updated_at DATETIME
  
$table->timestamps();
});

Мы вызываем метод create() класса PHPSchema для создания новой таблицы — первый параметр указывает на её имя, а вторым передаётся анонимная функция («closure»), где мы задаём её структуру. Функция принимает параметром объект создаваемой таблицы — вы можете назвать его как угодно, но я выбрал PHP$table, потому что это самое логичное имя.

Внутри функции мы можем использовать следующие красивые методы для определения структуры таблицы:

  • increments() — добавить автоинкрементируемое поле — его будет иметь бо(')льшая часть ваших таблиц
  • string() — создать поле VARCHAR — правда, «строка» куда более описательное имя, чем в стандарте SQL?
  • integer() — добавить целочисленное поле
  • float() — поле с дробным числом (число с плавающей точкой)
  • boolean() — логическое («булево») поле — истина (true) или ложь (false)
  • date() — поле даты
  • timestamp() — поле «отпечатка времени», так называемый «Unix timestamp»
  • text() — текстовое поле без ограничения по длине
  • blob()большой двоичный объект (BLOB)

К каждому из вызовов этих методов вы можете добавить PHP->nullable() — тогда поле сможет принимать значение NULL.

Вы так же можете вызывать метод PHPunsigned() для определения беззнакового числового поля. — прим. пер.

Подробности об этих и других методах можно найти в документации.

Хорошо, мы создали таблицу в методе PHPup() — теперь нам нужно удалить её в методе PHPdown(), таким образом структура базы данных вернётся в прежнее состояние при откате. Как обычно, класс PHPSchema содержит для этого специальный метод:

PHP
Schema::drop('users');

Ничто не может быть проще этого. PHPSchema также позволяет выполнять другие операции над базой данных — например, удаление полей таблицы (PHPdrop_column()), добавление индексов (PHPunique() и другие), а также добавлять внешние ключи («foreign keys»). Описание всех этих методов превратит статью в руководство по API, поэтому я не буду этого делать, ведь всё хорошо расписано на официальной документации — если хотите, можете ознакомиться с ней позднее, а мы пока продолжим. Как насчёт того, чтобы выполнить нашу миграцию?

Но перед этим давайте создадим таблицу laravel_migrations, в которой Laravel будет хранить информацию о применённых миграциях. У Artisan есть для этого специальная команда:

shphp artisan migrate:install

В результате мы увидим:

Migration table created successfully.

Отлично! Теперь эта таблица создана и мы наконец можем выполнить саму миграцию — на этот раз просто используем имя задания без указания метода:

shphp artisan migrate
Migrated: application/2012_03_30_220459_create_users

Замечательно! Теперь если мы посмотрим на нашу БД мы увидим, что таблица users была создана. Постойте — мы допустили ошибку! (На самом деле это не так, но мне хочется придать статье драматический окрас, к тому же мне нужна причина, чтобы продемонстировать откат). В таком случае давайте отменим изменения:

shphp artisan migrate:rollback
Rolled back: application/2012_03_30_220459_create_users

Конечно, кроме создания таблиц вы можете делать и другие вещи — например, заполнять их начальными данными — подробности этого описаны в моей следующей статье «Fluent — создание запросов к БД»

Как вы считаете, полезен ли этот материал? Да Нет

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.