Введение
В Laravel, класс PHPSchema
представляет собой независимый от БД интерфейс манипулирования таблицами. Он хорошо работает со всеми СУБД, поддерживаемыми Laravel, и предоставляет унифицированный API для любой из этих систем.
Создание и удаление таблиц
Для создания новой таблицы используется метод PHPSchema::create()
:
Schema::create('users', function ($table) {
$table->increments('id');
});
Первый параметр метода PHPcreate()
— имя таблицы, а второй — замыкание, которое получает объект PHPBlueprint
, использующийся для заполнения новой таблицы.
Чтобы переименовать существующую таблицу используется метод PHPrename()
:
Schema::rename($from, $to);
Для указания иного использующегося подключения к БД используется метод PHPSchema::connection()
:
Schema::connection('foo')->create('users', function ($table) {
$table->increments('id');
});
Для удаления таблицы вы можете использовать метод PHPSchema::drop()
:
Schema::drop('users');
Schema::dropIfExists('users');
Добавление полей
Для обновления существующей таблицы мы будем использовать метод PHPSchema::table()
:
Schema::table('users', function ($table) {
$table->string('email');
});
Конструктор таблиц поддерживает различные типы полей, которые вы можете использовать при создании таблиц.
Команда | Описание |
---|---|
$table->bigIncrements('id'); | Первичный последовательный ключ типа 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->mediumText('description'); | Поле MEDIUMTEXT |
$table->morphs('taggable'); | Добавляет INTEGER поле taggable_id и STRING поле taggable_type |
$table->smallInteger('votes'); | Поле SMALLINT |
$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->tinyInteger('numbers'); | Поле TINYINT |
->nullable() | Указывает, что поле может быть NULL |
->default($value) | Указывает значение по умолчанию для поля |
->unsigned() | Обозначает беззнаковое число (UNSIGNED) |
добавлено в 4.2 ()
Команда | Описание |
---|---|
$table->mediumInteger('numbers'); | Поле MEDIUMINT |
$table->nullableTimestamps(); | То же, что и timestamps(), но разрешены значения NULL |
$table->rememberToken(); | Добавляет поле remember_token с типом VARCHAR(100) NULL |
Вставка поля после существующего в MySQL
Если вы используете MySQL, то метод PHPafter()
позволит вам вставить поле после определённого существующего поля:
$table->string('name')->after('email');
Переименование полей
Для переименования поля можно использовать метод PHPrenameColumn()
объекта конструктора. Перед переименованием полей не забудьте добавить зависимость doctrine/dbal в ваш файл composer.json.
Schema::table('users', function ($table) {
$table->renameColumn('from', 'to');
});
Внимание: переименование полей типа ENUM не поддерживается.
Удаление полей
добавлено в 4.2 ()
Удаление одного поля из таблицы
Schema::table('users', function ($table) {
$table->dropColumn('votes');
});
Удаление нескольких полей таблицы
Schema::table('users', function ($table) {
$table->dropColumn('votes', 'avatar', 'location');
});
Проверка на существование
Проверка существования таблицы
Вы можете легко проверить существование таблицы или поля с помощью методов PHPhasTable()
и PHPhasColumn()
:
if (Schema::hasTable('users')) {
//
}
if (Schema::hasColumn('users', 'email')) {
//
}
Добавление индексов
Конструктор таблиц поддерживает несколько типов индексов. Есть два способа добавлять индексы: можно определять их на самих полях, либо добавлять отдельно.
$table->string('email')->unique();
Вы можете добавлять их отдельно. Ниже список всех доступных типов индексов.
Команда | Описание |
---|---|
$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. Не забудьте сначала создать поле для внешних ключей!
Вы также можете задать действия, происходящие при обновлении (on update) и удалении (on delete) записей.
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Для удаления внешнего ключа используется метод PHPdropForeign()
. Схема именования ключей — та же, что и индексов:
$table->dropForeign('posts_user_id_foreign');
Внимание: при создании внешнего ключа, указывающего на автоматическое числовое поле, не забудьте сделать указывающее поле (поле внешнего ключа) типа UNSIGNED.
Удаление индексов
Для удаления индекса вы должны указать его имя. По умолчанию Laravel присваивает каждому индексу осознанное имя. Просто объедините имя таблицы, имена всех его полей и добавьте тип индекса. Вот несколько примеров:
Команда | Описание |
---|---|
$table->dropPrimary('users_id_primary'); | Удаление первичного ключа из таблицы users |
$table->dropUnique('users_email_password_unique'); | Удаление уникального индекса на полях email и password из таблицы users |
$table->dropIndex('geo_state_index'); | Удаление простого индекса из таблицы geo |
добавлено в 4.2 ()
Удаление полей Timestamps и SoftDeletes
Для удаления полей с типами PHPtimestamps
, PHPnullableTimestamps
и PHPsoftDeletes
используйте следующие методы:
Команда | Описание |
---|---|
$table->dropTimestamps(); | Удаляет из таблицы поля created_at и updated_at |
$table->dropSoftDeletes(); | Удаляет из таблицы поле deleted_at |
Системы хранения
Для задания конкретной системы хранения таблицы установите свойство PHP$engine
объекта конструктора:
Schema::create('users', function ($table) {
$table->engine = 'InnoDB';
$table->string('email');
});
Система хранения — тип архитектуры таблицы. Некоторые СУБД поддерживают только свой встроенный тип (такие, как SQLite), в то время другие — например, MySQL — позволяют использовать различные системы даже внутри одной БД (наиболее используемыми являются MyISAM, InnoDB и MEMORY). Правда, использование таблиц различных архитектур в одном запросе заметно снижает его производительность — прим. пер.