Урок 06

Миграции

Что такое миграция

Миграция — это PHP-класс, который описывает изменение структуры базы данных. Миграции позволяют версионировать схему: создавать таблицы, добавлять колонки, менять индексы — и откатывать эти изменения. Одна и та же миграция работает на любой БД (MySQL, PostgreSQL, SQLite).

Создание

php artisan make:migration create_posts_table

Файл появится в database/migrations/ с именем, содержащим дату и время.

Структура миграции

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

Метод up выполняется при накате, down — при откате.

Типы колонок

  • id() — автоинкрементный первичный ключ
  • string('name', 100) — VARCHAR(100)
  • text('body') — TEXT
  • integer('views') — INT
  • bigInteger('count') — BIGINT
  • boolean('active') — BOOLEAN
  • decimal('price', 8, 2) — DECIMAL(8,2)
  • date('birthday') — DATE
  • dateTime('published_at') — DATETIME
  • timestamp('created_at') — TIMESTAMP
  • json('meta') — JSON
  • uuid('uuid') — UUID
  • enum('status', ['draft', 'published']) — ENUM

Модификаторы

$table->string('email')->unique();
$table->string('name')->nullable();
$table->integer('views')->default(0);
$table->string('slug')->index();

Внешние ключи

$table->foreignId('user_id')->constrained();

Создаёт колонку user_id типа BIGINT и внешний ключ на users.id. При удалении связанной записи поведение задаётся через cascadeOnDelete() или nullOnDelete().

Изменение существующей таблицы

php artisan make:migration add_status_to_posts_table --table=posts
public function up(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->string('status')->default('draft')->after('title');
    });
}

Команды

php artisan migrate            # накатить все новые миграции
php artisan migrate:rollback   # откатить последний батч
php artisan migrate:reset      # откатить всё
php artisan migrate:fresh      # снести все таблицы и накатить заново
php artisan migrate:status     # показать статус миграций