Миграции (Database: Migrations) в Laravel 5.*
Данный функционал дает возможность конфигурировать базу данных.
При команде
# php artisan migrate
будут прочитаны файлы в каталоге database/migrations по алфавиту и выполнены с того который последний указан в таблице migrations.
функция up
...
public function up()
{
//
}
...
может содержать Schema::create (создание таблицы) или Schema::table (обновление таблицы)
Примеры
Добавить/изменить поле «number» char(20) в таблицу orders:
...
public function up()
{
Schema::table('orders', function (Blueprint $table) {
$table->char('number', 20);
});
}
...
Создание таблицы «vendors» с индексным, авто-заполняемым полем «id», полем «name», полями время создания, время изменения
...
public function up()
{
Schema::create('vendors', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
...
Добавляет файл с пустым классом миграции
# php artisan make:migration create_users_table
Будет создан файл: database/migrations/’тек. дата’_’цифр. значение’_create_users_table.php (к примеру: database/migrations/2019_12_11_173505_create_users_table.php) с содержимым:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class Orders extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
Его можно заполнить созданием изменением или удаление таблицы/полей
Добавить миграцию с функцией создания таблицы:
# php artisan make:migration create_users_table --create=users
Добавить миграцию с функцией обновления таблицы:
# php artisan make:migration add_votes_to_users_table --table=users
Откат миграций
Для отмены изменений, сделанных последней миграцией, используйте команду rollback. Эта команда отменит результат последней «партии» миграций, которая может включать несколько файлов миграций:
# php artisan migrate:rollback
Можно сделать откат определённого числа миграций, указав параметр step для команды rollback. Например, эта команда откатит последние пять миграций:
# php artisan migrate:rollback --step=5
Команда migrate:reset отменит изменения всех миграций:
# php artisan migrate:reset
Откат всех миграций и их повторное применение одной командой
Команда migrate:refresh отменит изменения всех миграций, а затем выполнит команду migrate. Эта команда эффективно создаёт заново всю вашу БД:
# php artisan migrate:refresh
Обновить БД и запустить заполнение БД начальными данными…
# php artisan migrate:refresh --seed
Откатить и повторно применить определённое число миграций, указав параметр step для команды refresh.
# php artisan migrate:refresh --step=5
Таблицы
Создание таблиц
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
});
Проверка существования таблицы/столбца
if (Schema::hasTable('users')) {
//
}
if (Schema::hasColumn('users', 'email')) {
//
}
Переименование таблиц
Schema::rename($from, $to);
Удаление таблиц
Schema::drop('users');
// или
Schema::dropIfExists('users');
Столбцы
Создание столбцов
Schema::table('users', function (Blueprint $table) {
$table->string('email');
});
Доступные типы и модификаторы столбцов
Модифицировать, чтобы сделать столбец «обнуляемым»
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});
Доступные типы и модификаторы столбцов
Для изменения столбцов необходимо добавить зависимость doctrine/dbal. Библиотека Doctrine DBAL используется для определения текущего состояния столбца и создания SQL-запросов, необходимых для выполнения указанных преобразований столбца:
# composer require doctrine/dbal
Изменение атрибутов столбца
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});
Изменить столбец, чтобы он стал «обнуляемым»:
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->nullable()->change();
});
Переименование столбцов
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
Удаление столбцов
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});
Удалить несколько столбцов таблицы
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});
Индексы
значения столбца должны быть уникальными
$table->string('email')->unique();
создать индекс после определения столбца
$table->unique('email');
передать массив столбцов в метод index() для создания сложного индекса
$table->index(['account_id', 'created_at']);
Laravel автоматически генерирует подходящее имя индекса, но можно передать своё значение вторым аргументом метода:
$table->index('email', 'my_index_name');
Доступные типы индексов
Команда | Описание |
---|---|
$table->primary(‘id’); | Добавление первичного ключа |
$table->primary([‘first’, ‘last’]); | Добавление составных ключей |
$table->unique(’email’); | Добавление уникального индекса |
$table->unique(‘state’, ‘my_index_name’); | Добавление своего имени индекса (для версии 5.2 и выше) |
$table->unique([‘first’, ‘last’]); | Добавление составного уникального индекса (для версии 5.3 и выше) |
$table->index(‘state’); | Добавление базового индекса |
Удаление индексов
Для удаления индекса необходимо указать его имя. По умолчанию Laravel автоматически назначает имена индексам. Просто соедините имя таблицы, имя столбца-индекса и тип индекса. Вот несколько примеров:
Команда | Описание |
---|---|
$table->dropPrimary(‘users_id_primary’); | Удаление первичного ключа из таблицы «users» |
$table->dropUnique(‘users_email_unique’); | Удаление уникального индекса из таблицы «users» |
$table->dropIndex(‘geo_state_index’); | Удаление базового индекса из таблицы «geo» |
Если передать массив столбцов в метод для удаления индексов, будет сгенерировано стандартное имя индекса на основе имени таблицы, столбца и типа ключа:
Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // Удаление индекса 'geo_state_index'
})
ограничений для внешнего ключа, которые используются для обеспечения ссылочной целостности на уровне базы данных
Schema::table('posts', function (Blueprint $table) {
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
});
указать требуемое действие для свойств «on delete» и «on update» ограничений:
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Для удаления внешнего ключа используйте метод dropForeign(). Ограничения внешнего ключа используют те же принципы именования, что и индексы. Итак, мы соединим имя таблицы и столбцов из ограничения, а затем добавим суффикс «_foreign»:
$table->dropForeign('posts_user_id_foreign');
Или можно передать значение массива, при этом для удаления будет автоматически использовано стандартное имя ограничения:
$table->dropForeign(['user_id']);
Загрузка начальных данных в БД
Пример класса для загрузки начальных данных
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(['email' => 'foo@bar.com']);
}
}
Для добавления данных в БД используйте Artisan-команду db:seed:
# php artisan db:seed
По умолчанию команда db:seed вызывает класс DatabaseSeeder, который может быть использован для вызова других классов, заполняющих БД данными. Но, можно использовать параметр —class для указания конкретного класса для вызова:
# php artisan db:seed --class=UserTableSeeder
Можно использовать для заполнения БД данными команду migrate:refresh, которая также откатит и заново применит все ваши миграции:
# php artisan migrate:refresh --seed