Конструктор таблиц
11.x
.
Почему это важно?
Введение
Класс Schema
представляет собой независимый от типа БД интерфейс манипулирования таблицами. Он хорошо работает со всеми БД, поддерживаемыми Laravel и предоставляет унифицированный API для любой из этих систем.
Создание и удаление таблиц
Для создания новой таблицы используется метод Schema::create
:
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
});
Первый параметр метода create
– имя таблицы, а второй – функция-замыкание, которое получает объект Blueprint
, использующийся для определения таблицы.
Чтобы переименовать существующую таблицу используется метод rename
:
Schema::rename($from, $to);
Для указания иного использующегося подключения к БД используется метод Schema::connection
:
Schema::connection('foo')->create('users', function(Blueprint $table)
{
$table->increments('id');
});
Для удаления таблицы вы можете использовать метод Schema::drop
:
Schema::drop('users');
Schema::dropIfExists('users');
Добавление полей
Для изменения существующей таблицы используется метод Schema::table
:
Schema::table('users', function(Blueprint $table)
{
$table->string('email');
});
Конструктор таблиц поддерживает различные типы полей:
Команда | Описание |
---|---|
$table->bigIncrements('id'); |
Первичный последовательный (autoincrement) ключ типа BIGINT |
$table->bigInteger('votes'); |
Поле BIGINT |
$table->binary('data'); |
Поле BLOB |
$table->boolean('confirmed'); |
Поле BOOLEAN |
$table->char('name', 4); |
Поле CHAR с указанием длины |
$table->date('created_at'); |
Поле DATE |
$table->dateTime('created_at'); |
Поле DATETIME |
$table->decimal('amount', 5, 2); |
Поле DECIMAL с параметрами "точность" (общее количество значащих десятичных знаков) и "масштаб" (количество десятичных знаков после запятой) |
$table->double('column', 15, 8); |
Поле DOUBLE |
$table->enum('choices', array('foo', 'bar')); |
Поле ENUM |
$table->float('amount'); |
Поле FLOAT |
$table->increments('id'); |
Первичный последовательный (autoincrement) ключ |
$table->integer('votes'); |
Поле INTEGER |
$table->longText('description'); |
Поле LONGTEXT |
$table->mediumInteger('numbers'); |
Поле MEDIUMINT |
$table->mediumText('description'); |
Поле MEDIUMTEXT |
$table->morphs('taggable'); |
Создается два поля - INTEGER taggable_id и STRING taggable_type |
$table->nullableTimestamps(); |
То же, что и timestamps() , но разрешены NULL |
$table->smallInteger('votes'); |
Поле SMALLINT |
$table->tinyInteger('numbers'); |
Поле TINYINT |
$table->softDeletes(); |
Столбец deleted_at для реализации псевдоудаления |
$table->string('email'); |
Поле VARCHAR |
$table->string('name', 100); |
Поле VARCHAR с заданной длиной |
$table->text('description'); |
Поле TEXT |
$table->time('sunrise'); |
Поле TIME |
$table->timestamp('added_on'); |
Поле TIMESTAMP |
$table->timestamps(); |
Столбцы created_at и updated_at |
$table->rememberToken(); |
Столбец remember_token VARCHAR(100) NULL у таблицы users для реализации функции "запомнить меня" при логине |
->nullable() |
данное поле может быть NULL |
->default($value) |
установка дефолтного значения поля |
->unsigned() |
запрещаются отрицательные значения |
Вставка поля после существующего (в MySQL)
Если вы используете MySQL, то при изменении таблицы вы можете указать, куда именно добавлять новое поле
$table->string('name')->after('email');
Переименование полей
Для переименования поля можно использовать метод renameColumn
. Переименование возможно только при подключенном пакете doctrine/dbal
в composer.json
.
Schema::table('users', function(Blueprint $table)
{
$table->renameColumn('from', 'to');
});
Примечание: переименование полей типа
enum
не поддерживается.
Удаление полей
Для удаления поля можно использовать метод dropColumn
. Удаление возможно только при подключенном пакете doctrine/dbal
в composer.json
.
Удаление одного поля из таблицы:
Schema::table('users', function(Blueprint $table)
{
$table->dropColumn('votes');
});
Удаление сразу нескольких полей
Schema::table('users', function(Blueprint $table)
{
$table->dropColumn(array('votes', 'avatar', 'location'));
});
Проверка на существование
Проверка существования таблицы
Вы можете легко проверить существование таблицы или поля с помощью методов hasTable
и hasColumn
.
if (Schema::hasTable('users'))
{
//
}
Проверка существования поля
if (Schema::hasColumn('users', 'email'))
{
//
}
Добавление индексов
Есть два способа добавлять индексы: можно определять их во время определения полей, либо добавлять отдельно:
$table->string('email')->unique();
$table->unique('email');
Ниже список всех доступных типов индексов.
Команда | Описание |
---|---|
$table->primary('id'); |
Добавляет первичный ключ |
$table->primary(array('first', 'last')); |
Добавляет составной первичный ключ |
$table->unique('email'); |
Добавляет уникальный индекс |
$table->index('state'); |
Добавляет простой индекс |
Внешние ключи
Laravel поддерживает добавление внешних ключей (foreign key constraints) для ваших таблиц:
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
В этом примере мы указываем, что поле user_id
связано с полем id
таблицы users
. Обратите внимание, что поле user_id
должно существовать перед определением ключа.
Вы также можете задать действия, происходящие при обновлении (on update) и добавлении (on delete) записей.
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Для удаления внешнего ключа используется метод dropForeign
. Схема именования ключей – та же, что и индексов:
$table->dropForeign('posts_user_id_foreign');
Внимание: при создании внешнего ключа, указывающего на автоинкрементное (автоувеличивающееся) числовое поле, не забудьте сделать указывающее поле (поле внешнего ключа) типа
unsigned
.
Удаление индексов
Для удаления индекса вы должны указать его имя. По умолчанию Laravel присваивает каждому индексу осознанное имя. Просто объедините имя таблицы, имена всех его полей и добавьте тип индекса. Вот несколько примеров:
Command | Description |
---|---|
$table->dropPrimary('users_id_primary'); |
Удаление первичного ключа из таблицы "users" |
$table->dropUnique('users_email_unique'); |
Удаление уникального индекса на полях "email" и "password" из таблицы "users" |
$table->dropIndex('geo_state_index'); |
Удаление простого индекса из таблицы "geo" |
Удаление столбцов дат создания и псевдоудаления
Для того, чтобы удалить столбцы created_at , updated_at и deleted_at, которые создаются методами timestamps
(или nullableTimestamps
) и softDeletes
, вы можете использовать следующие методы:
Команда | Описания |
---|---|
$table->dropTimestamps(); |
Удаление столбцов created_at и updated_at |
$table->dropSoftDeletes(); |
Удаление столбца deleted_at |
Storage Engines (системы хранения)
Для задания конкретной системы хранения таблицы установите свойство engine
объекта конструктора:
Schema::create('users', function(Blueprint $table)
{
$table->engine = 'InnoDB';
$table->string('email');
});
Система хранения – тип архитектуры таблицы. Некоторые СУБД поддерживают только свой встроенный тип (такие, как SQLite), в то время другие – например, MySQL – позволяют использовать различные системы даже внутри одной БД (наиболее используемыми являются
MyISAM
,InnoDB
иMEMORY
).