{{TOC}} {{DOCVER 5.0=f6e862ba51a97f2bf9865f35fd5c522c14af93a1 31.07.2015 15:36:24}} .(alert) Данная статья документации актуальна только для версии 5.0 и была удалена в версии 5.1. == Введение == В Laravel, класс %%Schema%% представляет собой независимый от БД интерфейс манипулирования таблицами. Он хорошо работает со всеми СУБД, поддерживаемыми Laravel, и предоставляет унифицированный API для любой из этих систем. == Создание и удаление таблиц == Для создания новой таблицы используется метод %%Schema::create()%%: %% Schema::create('users', function($table) { $table->increments('id'); }); %% Первый аргумент метода %%create()%% - имя таблицы, а второй - замыкание, которое получает объект %%Blueprint%%, использующийся для заполнения новой таблицы. Чтобы переименовать существующую таблицу используется метод %%rename()%%: %% Schema::rename($from, $to); %% Для указания того, какое подключение к БД должно использоваться для выполнения операции, используется метод %%Schema::connection()%%: %% Schema::connection('foo')->create('users', function($table) { $table->increments('id'); }); %% Для удаления таблицы вы можете использовать метод %%Schema::drop()%%: %% Schema::drop('users'); Schema::dropIfExists('users'); %% == Добавление полей == Для обновления существующей таблицы мы будем использовать метод %%Schema::table()%%: %% Schema::table('users', function($table) { $table->string('email'); }); %% Конструктор таблиц поддерживает различные типы полей, которые вы можете использовать при создании таблиц: %%(hvlraw)
Команда Описание
$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', ['foo', 'bar']); Поле ENUM
$table->float('amount'); Поле FLOAT
$table->increments('id'); Первичный последовательный ключ (autoincrement)
$table->integer('votes'); Поле INTEGER
$table->json('options'); Поле JSON
$table->jsonb('options'); Поле JSONB
$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
->nullable() Указывает, что поле может быть NULL
->default($value) Указывает значение по умолчанию для поля
->unsigned() Переводит INTEGER в беззнаковое число UNSIGNED
%% **Вставка поля после существующего в MySQL** Если вы используете MySQL, то метод %%after()%% позволит вам вставить поле после определённого существующего поля: %% $table->string('name')->after('email'); %% == Изменение полей == .(alert) **Внимание:** Перед изменением полей не забудьте добавить зависимость %%(t)doctrine/dbal%% в свой файл %%(t)composer.json%%. Иногда необходимо изменить существующее поле. Например, если надо увеличить размер строкового поля. С методом %%change()%% это легко! Давайте увеличим размер поля %%(t)name%% с 25 до 50: %% Schema::table('users', function($table) { $table->string('name', 50)->change(); }); %% Также мы можем сделать поле обнуляемым (nullable): %% Schema::table('users', function($table) { $table->string('name', 50)->nullable()->change(); }); %% == Переименование полей == Для переименования поля можно использовать метод %%renameColumn()%% объекта конструктора. Перед переименованием полей не забудьте добавить зависимость %%(t)doctrine/dbal%% в ваш файл %%(t)composer.json%%. %% Schema::table('users', function($table) { $table->renameColumn('from', 'to'); }); %% .(alert) **Внимание:** Переименование полей типа **ENUM** не поддерживается. == Удаление полей == Для удаления поля можно использовать метод конструктора таблиц %%dropColumn()%%. Перед удалением поля убедитесь, что в файл %%(t)composer.json%% добавлена зависимость %%(conf)doctrine/dbal%%. **Удаление одного поля из таблицы** %% Schema::table('users', function($table) { $table->dropColumn('votes'); }); %% **Удаление нескольких полей таблицы** %% Schema::table('users', function($table) { $table->dropColumn(['votes', 'avatar', 'location']); }); %% == Проверка на существование == Вы можете легко проверить существование таблицы или поля с помощью методов %%hasTable()%% и %%hasColumn()%%. **Проверка существования таблицы** %% if (Schema::hasTable('users')) { // } %% **Проверка существования поля** %% if (Schema::hasColumn('users', 'email')) { // } %% == ((#индексы)) Добавление индексов == Конструктор таблиц поддерживает несколько типов индексов. Есть два способа добавлять индексы. Первый - определять их на самих полях, либо добавлять отдельно: %% $table->string('email')->unique(); %% Или вы можете добавлять их отдельными строками. Ниже список всех доступных типов индексов: %%(hvlraw)
Команда Описание
$table->primary('id'); Добавляет первичный ключ
$table->primary(['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'); %% В этом примере мы указываем, что поле %%(t)user_id%% связано с полем %%(t)id%% таблицы %%(t)users%%. Не забудьте сначала создать поле для внешних ключей! Вы также можете задать действия, происходящие при обновлении (//on update//) и удалении (//on delete//) записей: %% $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); %% Для удаления внешнего ключа используется метод %%dropForeign()%%. Схема именования ключей - та же, что и для ((#удаление_индексов индексов)): %% $table->dropForeign('posts_user_id_foreign'); %% .(alert) **Внимание:** при создании внешнего ключа, указывающего на инкрементное числовое поле, не забудьте сделать поле внешнего ключа типа **UNSIGNED**. == ((#удаление_индексов)) Удаление индексов == Для удаления индекса вы должны указать его имя. По умолчанию Laravel присваивает каждому индексу осознанное имя. Просто объедините имя таблицы, имена всех его полей и добавьте тип индекса. Вот несколько примеров: %%(hvlraw)
Команда Описание
$table->dropPrimary('users_id_primary'); Удаление первичного ключа из таблицы users
$table->dropUnique('users_email_unique'); Удаление уникального индекса из таблицы users
$table->dropIndex('geo_state_index'); Удаление простого индекса из таблицы geo
%% == Удаление полей Timestamps и SoftDeletes == Для удаления полей с типами %%timestamps%%, %%nullableTimestamps%% и %%softDeletes%% используйте следующие методы: %%(hvlraw)
Команда Описание
$table->dropTimestamps(); Удаляет из таблицы поля created_at и updated_at
$table->dropSoftDeletes(); Удаляет из таблицы поле deleted_at
%% == Системы хранения == Для задания конкретной системы хранения таблицы задайте свойство %%engine%% конструктора таблиц: %% Schema::create('users', function($table) { $table->engine = 'InnoDB'; $table->string('email'); }); %% .(tl_note) **Система хранения** - тип архитектуры таблицы. Некоторые СУБД поддерживают только свой встроенный тип (такие, как SQLite), в то время другие - например, MySQL - позволяют использовать различные системы даже внутри одной БД (наиболее используемыми являются //MyISAM//, //InnoDB// и //MEMORY//). Правда, использование таблиц различных архитектур в одном запросе заметно снижает его производительность - //прим. пер.//