Миграции и сидеры — это два инструмента в PHP-фреймворке Laravel, которые упрощают работу с БД и решают проблемы, связанные с несогласованностью.
В Laravel миграции — это набор функций, схожий с контролем версии БД. Миграции позволяют команде разработчиков определять общую схему БД и совместно использовать её. Благодаря этому инструменту все участники команды разработчиков в курсе изменений.
Сидеры в Laravel — это инструмент для наполнения базы данных тестовыми данными. Есть несколько классов наполнителей, которые позволяют контролировать процесс наполнения.
Прочитав эту статью, вы узнаете как начать работу в Laravel и создавать миграции и сидеры.
В этом обучающем материале мы будем использовать Docker для запуска приложения Laravel. Специально для Docker есть интерфейс командной строки Laravel Sail. Он по умолчанию встроен в пакет Laravel.
Устанавливать всё ПО будем на Windows 10. В этом мануале мы собрали полноценную инструкцию действий из различных материалов Microsoft, Docker и Laravel. Сначала мы установим WSL, затем Docker и уже Laravel. Ниже будет описаны действия конкретно для Windows 10, инструкцию для остальных операционных систем вы найдете в документации Laravel.
WSL(Windows Subsystem for Linux) — это программная прослойка для запуска Linux-приложений на Windows.
Если у вас версия Windows 10 2004 и выше, то для установки достаточно выполнить эту команду в PowerShell от имени администратора:
wsl --install
По умолчанию используется дистрибутив Ubuntu. Нам нужна WSL 2, поэтому дополнительно изменим версию. Процесс займет несколько минут:
wsl --set-version Ubuntu 2
Для проверки версии используем команду wsl.exe -l -v
:
PS C:\WINDOWS\system32> wsl.exe -l -v
NAME STATE VERSION
* Ubuntu Stopped 2
Чтобы проверить версию Windows, нажмите Win+R и введите команду winver
. Появится такое окно:
Если версия ниже, чем 2004, то команда wsl --install
не сможет установить WSL. Вот список действий для старых версий (как минимум нужна версия 1903 со сборкой 18362):
Включаем подсистему Windows для Linux
Открываем PowerShell от имени администратора и выполняем эту команду:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Включаем функцию виртуальной машины
В ранее открытом терминале PowerShell выполняем такую команду:
dism.exe /online /enable-feature /featurename: VirtualMachinePlatform /all /norestart
Перезагружаем компьютер
Для завершения установки.
Загружаем и устанавливаем пакет обновления ядра Linux
После перехода по этой ссылке начнется загрузка пакета обновления. Установите его.
Выбираем WSL 2 в качестве версии по умолчанию
После перезагрузки снова открываем PowerShell от имени администратора и выполняем эту команду:
wsl --set-default-version 2
Устанавливаем дистрибутив Linux
Выберите необходимый дистрибутив, загрузите его из Microsoft Store и установите:
После установки вы сможете через меню поиска зайти в консоль выбранной вами ОС:
Заходим на сайт docker.com, нажимаем «Get Started» и загружаем Docker Desktop для Windows. В процессе установки необходимо нажать галочку «Use WSL 2 instead HYPER-V»:
Открываем Docker, нажимаем на «шестеренку» на верхней панели и попадаем меню настроек:
На вкладке General отображены основные настройки. Здесь мы можем выбрать необходимые пункты (например включить WSL2) и отключить ненужное (например отправку статистики). После выставления настроек на этой вкладке переходим к «Resources». Здесь необходимо включить интеграцию с Ubuntu:
После этого нажимаем на кнопку “Apply & Restart”. Докер перезагрузится с новыми настройками.
Создадим новое приложение Laravel. Заходим в терминал Ubuntu и вводим такую команду:
curl -s https://laravel.build/example-app | bash
example-app
— каталог нового приложения Laravel. При первом выполнении команда не сможет найти необходимые образы и начнет их загрузку:
После завершения загрузки Laravel Sail станет доступен. Переходим в каталог проекта:
cd example-app
И создаем контейнеры Laravel Sail:
./vendor/bin/sail up
Создание контейнеров может затянуться, но в следующие запуски Sail будут проходить быстро. Sail будет запускать веб-приложение с информационными ресурсами Laravel на localhost:
Если у вас возникла ошибка “The Stream Or File “/Var/Www/Html/Storage/Logs/Laravel.Log” Could Not Be Opened In Append Mode: Failed To Open Stream: Permission Denied”, то вам необходимо поменять права файла docker.sock командой:
sudo chmod 666 /var/run/docker.sock
Как уже было сказано, миграции похожи на контроль версий. С помощью них пользователь может создавать и изменять схему базы данных или делать откаты. Миграции не определяют содержание таблиц (кроме ограничений).
Laravel migration проекта хранятся в его каталоге по пути ./database/migrations/. В созданном приложении Laravel Sail изначально есть несколько миграций:
Попробуем запустить их и проверим результат. Заходим в терминал Ubuntu и прописываем:
./vendor/bin/sail up -d //запуск приложения в фоновом режиме
./vendor/bin/sail artisan migrate
Вывод:
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (1,846.42ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (1,965.53ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (2,196.68ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated: 2019_12_14_000001_create_personal_access_tokens_table (3,325.95ms)
Миграции в Laravel выполняются в порядке их создания. Это позволяет Laravel корректно реализовывать механизм откатов. Запуск миграций “костыльными” путями по отдельности может привести к потере данных в БД.
Проверим, создались ли соответствующие таблицы в базе данных. Подключимся к базе данных через Heidi SQL. Параметры подключения находятся файле конфигураций среды .env:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=example_app
DB_USERNAME=sail
DB_PASSWORD=password
Параметры можно задать другие.
Подключившись к бд, мы увидим текущее состояние базы данных:
Теперь создадим новую миграцию и разберемся, как она работает.
Сначала создадим класс миграции. Для этого выполняем команду make:migration в терминале Ubuntu:
./vendor/bin/sail artisan make:migration example_migr
Вывод:
Created Migration: 2022_06_02_005033_example_migr
Название миграций состоит из двух частей: временной метки и имени, выбранного пользователем. Временная метка помогает запускать миграции в правильном порядке.
Теперь откройте созданный файл в любом удобном вам редакторе:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Запуск миграции
*
* @return void
*/
public function up()
{
//
}
/**
* Откат миграции
*
* @return void
*/
public function down()
{
//
}
};
В миграциях используется два метода: up() и down().
В методе up() описываются изменения БД, которые необходимо выполнить при запуске миграции. Метод down() отменяет изменения, сделанные up().
Напишем код миграции для создания таблицы товаров со следующими столбцами:
Вот код миграции для этой таблицы:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
*Запуск миграции.
*
* @return void
*/
public function up()
{
Schema::create('items', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->integer('count');
$table->integer('cost');
});
}
/**
* Откат миграции
*
* @return void
*/
public function down()
{
Schema::dropIfExists('items');
}
};
Schema::create
создает новую таблицу. Schema::dropIfExists
удаляет таблицу, если она существует. Сохраним изменения в файле и выполним снова миграцию через терминал:
./vendor/bin/sail artisan migrate
Migrating: 2022_06_02_005033_example_migr
Migrated: 2022_06_02_005033_example_migr (658.56ms)
Для отката миграций есть несколько команд:
migrate:rollback
— откат последней команды migrate
. Также можно откатить некоторое количество выполнений migrate
с помощью параметра --steps [число]
;migrate:reset
— откат всех миграций;migrate:refresh
— откат всех миграций и выполнение migrate
;migrate:fresh
— удаление всех таблиц из БД и выполнение migrate
.На данный момент в базе данных только пустые таблицы. Их можно наполнить с помощью сидеров. Сидеры необходимы для наполнения базы данных фиктивными или тестовыми данными.
Создать сидер можно с помощью команды make:seeder
:
./vendor/bin/sail artisan make:seeder ExampleSeeder
Seeder created successfully.
Все сидеры находятся в каталоге database/seeders. Переходим в него и открываем ExampleSeeder
в редакторе:
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class ExampleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
В метод run()
необходимо поместить код для генерации данных. Добавим в таблицу «items» 10 случайных записей:
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
class ExampleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
for ($i = 1; $i <= 10; $i++) {
DB::table('items')->insert([
'id' => $i,
'name' => Str::random(5),
'cost' => rand(5,20),
'count' => rand(0,10),
]);
}
}
}
С помощью команды insert()
мы добавляем запись в таблицу «items». Но новые классы сидеров не запускаются автоматически. Его вызов необходимо добавить в главный класс DatabaseSeeder
:
public function run()
{
$this->call(ExampleSeeder::class);
}
После этого можем запустить наполнение данными:
./vendor/bin/sail artisan db:seed
Seeding: Database\Seeders\ExampleSeeder
Seeded: Database\Seeders\ExampleSeeder (841.68ms)
Database seeding completed successfully.
А вот результат в базе данных:
Мы рассмотрели такие инструменты фреймворка Laravel, как миграции и сидеры, которые упрощают работу с базами данных. А сервер для любых экспериментов всегда можно арендовать на timeweb.cloud.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.