База данных: Миграции (Database: Migrations)
Миграции похожи на систему контроля версиий, но только для базы данных (БД). Они позволяют команде разработчиков легко изменять схему БД приложения и делиться этими изменениями. Миграции обычно связаны с построителем схем Laravel (Laravel's schema builder) для облегчения создания схемы БД приложения.
Laravel Schema facade предоставляет независимую от БД поддержку создания и управления таблицами. Она предоставляет выразительный API для всех поддерживаемых Laravel БД.
Создание (Generating Migrations)
Для создания миграции используйте make:migration Artisan command:
Миграция будет помещена в папку database/migrations . Каждое имя файла миграции содержит метку времени, которая позволяет Laravel определять порядок применения миграций.
Опции --table и --create служат для задания имени таблицы и указания будет ли миграция создавать новую таблицу. Проще говоря, эти опции служат для предварительного заполнения генерируемого файла миграции:
Для определения иного пути для сохранения файла миграции служит опция --path . Путь должен задаваться относительно корня приложения.
Структура миграции (Migration Structure)
Класс миграции содержит 2 метода: up и down . up нужен для добавления новых таблиц, столбцов или индексов в БД, тогда как down просто отменяет операции, выполненные в методе up .
Внутри обоих методов вы можете использовать конструктор схем для создания и модификации таблиц. Для изучения всех методов, доступных в конструкторе, обратитесь к документации check out its documentation. Давайте взглянем на пример миграции, которая создает таблицу flights :
Запуск миграций (Running Migrations)
Для запуска всех еще незапускавшихся миграций используйте команду migrate . Если вы используете Homestead virtual machine, то вы должны запустить ее на вашей VM:
Если вы получили сообщение об ошибке "class not found" во время запуска, попробуйте выполнить команду composer dump-autoload и потом вновь выполнить миграцию.
Принудительные миграции на продакшене (Forcing Migrations To Run In Production)Некоторые операции миграции могут привести к потере данных. В целях защиты от запуска таких команд у вас будет запрашиваться подтверждение перед их выполнением. Для выполнения команд без подтверждения укажите флаг force :
Откат миграций (Rolling Back Migrations)Для отката последней выполненной миграции используйте команду rollback . Обратите внимание, что откат отменит операции, выполненные последним запущенным файлом миграции, который может подключать другие файлы миграции:
Команда migrate:reset отменит все миграции:
Откат/запуск миграции одной командой (Rollback / Migrate In Single Command)Команда migrate:refresh выполняет откат всех миграций, а затем запускает команду migrate . Команда полезна для пересоздания всей БД:
Написание миграций (Writing Migrations)
Создание таблиц (Creating Tables)Метод Schema::create служит для создания таблицы. Принимает 2 аргумента. Первый - имя таблицы, второй - замыкание, которое в качестве аргумента принимает объект Blueprint , используемый для определения новой таблицы:
Для определения столбцов таблицы вы можете использовать любые методы конструктора схем column methods.
Проверка существования таблицы/столбца (Checking For Table / Column Existence)Проверить существует ли таблица или колонка в таблице можно методами hasTable и hasColumn :
Подключение и Движок Хранилища (Connection & Storage Engine)Если требуется использовать подключение, отличное от дефолтного, используйте метод connection :
Для установки движка таблицы, задайте свойство engine :
Переименование/удаление таблиц (Renaming / Dropping Tables) Создание столбцов (Creating Columns)Для изменения существующей таблицы служит метод Schema::table . Подобно методу create метод table принимает два аргумента: имя таблицы и замыкание, которое получает в качестве аргумента экземпляр класса Blueprint . Добавление столбца в таблицу:
Доступные типы столбцов (Available Column Types)Перечень доступных типов в классе конструкторе схемы:
Команда Описание $table->bigIncrements('id'); Incrementing ID (primary key) using a "UNSIGNED BIG INTEGER" equivalent. $table->bigInteger('votes'); BIGINT equivalent for the database. $table->binary('data'); BLOB equivalent for the database. $table->boolean('confirmed'); BOOLEAN equivalent for the database. $table->char('name', 4); CHAR equivalent with a length. $table->date('created_at'); DATE equivalent for the database. $table->dateTime('created_at'); DATETIME equivalent for the database. $table->decimal('amount', 5, 2); DECIMAL equivalent with a precision and scale. $table->double('column', 15, 8); DOUBLE equivalent with precision, 15 digits in total and 8 after the decimal point. $table->enum('choices', ['foo', 'bar']); ENUM equivalent for the database. $table->float('amount'); FLOAT equivalent for the database. $table->increments('id'); Incrementing ID (primary key) using a "UNSIGNED INTEGER" equivalent. $table->integer('votes'); INTEGER equivalent for the database. $table->json('options'); JSON equivalent for the database. $table->jsonb('options'); JSONB equivalent for the database. $table->longText('description'); LONGTEXT equivalent for the database. $table->mediumInteger('numbers'); MEDIUMINT equivalent for the database. $table->mediumText('description'); MEDIUMTEXT equivalent for the database. $table->morphs('taggable'); Adds INTEGER taggable_id and STRING taggable_type . $table->nullableTimestamps(); Same as timestamps() , except allows NULLs. $table->rememberToken(); Adds remember_token as VARCHAR(100) NULL. $table->smallInteger('votes'); SMALLINT equivalent for the database. $table->softDeletes(); Adds deleted_at column for soft deletes. $table->string('email'); VARCHAR equivalent column. $table->string('name', 100); VARCHAR equivalent with a length. $table->text('description'); TEXT equivalent for the database. $table->time('sunrise'); TIME equivalent for the database. $table->tinyInteger('numbers'); TINYINT equivalent for the database. $table->timestamp('added_on'); TIMESTAMP equivalent for the database. $table->timestamps(); Adds created_at and updated_at columns. $table->uuid('id'); UUID equivalent for the database.
Модификация столбцов (Column Modifiers)В дополнение к типам, перечисленным выше, доступны модификаторы столбцов, которые можно использовать при добавлении столбца. Добавим столбцу возможность принимать значения NULL:
Ниже приведен список доступных модификаторов. Список не включает индексные модификаторы index modifiers:
Модификатор Описание ->first() Place the column "first" in the table (MySQL Only) ->after('column') Place the column "after" another column (MySQL Only) ->nullable() Allow NULL values to be inserted into the column ->default($value) Specify a "default" value for the column ->unsigned() Set integer columns to UNSIGNED
Изменение столбцов (Modifying Columns) Необходимые условия (Prerequisites)Перед изменением столбца убедитесь, что в файле composer.json есть зависимость doctrine/dbal . Библиотека Doctrine DBAL нужна для определения текущего статуса столбца и создания SQL запросов для выполнения заданных изменений столбца.
Обновление атрибутов столбца (Updating Column Attributes)Метод change меняет тип столбца либо атрибуты. Например, увеличим размер строкового столбца name с 25 до 50:
Добавить вставку значений NULL:
Переименование столбцов (Renaming Columns) Удаление столбцов (Dropping Columns)Удаление нескольких столбцов:
Создание индексов (Creating Indexes)Создание индекса для существующего столбца:
Индекс на основе нескольких столбцов:
Laravel автоматически генерирует имя индекса, но можно указать его самому во втором параметре метода:
Доступные типа индексов (Available Index Types) Команда Описание $table->primary('id'); Add a primary key. $table->primary(['first', 'last']); Add composite keys. $table->unique('email'); Add a unique index. $table->unique('state', 'my_index_name'); Add a custom index name. $table->index('state'); Add a basic index. Удаление индексов (Dropping Indexes)Для удаление индекса нужно указать имя индекса. По умолчанию, Laravel создает имя для индекса, соединяя имя таблицы, имя столбца и тип индекса. Несколько примеров:
Команда Описание $table->dropPrimary('users_id_primary'); Удалить primary key из таблицы "users". $table->dropUnique('users_email_unique'); Удалить уникальный индекс из таблицы "users". $table->dropIndex('geo_state_index'); Удалить обычный индекс из таблицы "geo".
Если методу для удаления передать массив столбцов для удаления индекса, то имя индекса будет сформировано автоматически:
Ограничения внешнего ключа (Foreign Key Constraints)Laravel поддерживает создание внешних ключей, которые служат для обеспечения целостности данных на уровне БД. Например, определим столбец user_id в таблице posts , который сылается на столбец id таблицы users :
Задать желаемое действие для свойств "on delete" и "on update" внешнего ключа:
При создании имени внешнего ключа используется то же соглашение о присвоении имен, что и для индексов. Laravel будет создавать имя на основе имени таблицы, столбца и суффикса "_foreign". Удаление внешнего ключа:
Удаление при задании столбца в массиве, что формирует имя удаляемого ключа автоматически: