Миграции (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();
});
Столбы следующих типов нельзя «изменить»: char, double, enum, mediumInteger, timestamp, tinyInteger, ipAddress, json, jsonb, macAddress, mediumIncrements, morphs, nullableMorphs, nullableTimestamps, softDeletes, timeTz, timestampTz, timestamps, timestampsTz, unsignedMediumInteger, unsignedTinyInteger, uuid.

Переименование столбцов

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']);
});
Удаление и изменение нескольких столбцов одной миграцией не поддерживается для базы данных SQLite.

 

Индексы

значения столбца должны быть уникальными

$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