{{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)