Добавить новый столбец в существующую таблицу в миграции

270

Я не могу понять, как добавить новый столбец в мою существующую таблицу базы данных, используя инфраструктуру Laravel.

Я пытался редактировать файл миграции, используя ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

В терминале я выполняю php artisan migrate:installи migrate.

Как добавить новые столбцы?

Ким Ларсен
источник
Было бы полезно, если бы вы могли включить любые ошибки, которые вы получаете; что вы ожидаете случиться; и что на самом деле происходит?
Фил Спаркс
9
Отличный вопрос Существует множество документов по миграции, в которых показано API и способы создания таблиц в ПЕРВЫЙ РАЗ. Тогда все это терпит неудачу, когда вы все больше разрабатываете свое приложение и вам нужно изменить структуру БД.
Эндрю Копер

Ответы:

612

Для создания миграции вы можете использовать команду migrate: make в CLI Artisan. Используйте конкретное имя, чтобы избежать конфликтов с существующими моделями

для Laravel 3:

php artisan migrate:make add_paid_to_users

для Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Затем вам нужно использовать Schema::table()метод (поскольку вы получаете доступ к существующей таблице, а не создаете новую). И вы можете добавить столбец, как это:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

и не забудьте добавить опцию отката:

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('paid');
    });
}

Затем вы можете запустить свои миграции:

php artisan migrate

Все это хорошо описано в документации к Laravel 3:

И для Laravel 4 / Laravel 5:

Редактировать:

используйте $table->integer('paid')->after('whichever_column');для добавления этого поля после определенного столбца.

Фил Спаркс
источник
3
Простоphp artisan migrate
Фил Спаркс
Что-то не так. Я делаю "db: make", чтобы создать новый файл миграции. И затем я помещаю Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); внутрь. И запустите «php artisan migrate», но получите фатальную ошибку: невозможно переопределить класс Users в /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php в строке 3
Ким Ларсен,
Создание миграций также рассматривается в документации. Вы должны дать ему более конкретное имя, например «add_paid_to_users», таким образом, оно не будет конфликтовать с вашей моделью столкновения.
Фил Спаркс
Похоже, что любой URL-адрес документа Laravel 3 перенаправляет на документы Laravel 4. Вот ссылки на 3 документа для построителя схем и миграций
6
Начиная с Laravel 5 эта команда теперь будетphp artisan make:migration add_paid_to_users
mikelovelyuk
64

Я добавлю ответ mike3875 для будущих читателей, использующих Laravel 5.1 и выше.

Чтобы ускорить процесс, вы можете использовать флаг "--table" следующим образом:

php artisan make:migration add_paid_to_users --table="users"

Это добавит upи downсодержание метода автоматически:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

Точно так же вы можете использовать эту --create["table_name"]опцию при создании новых миграций, которые добавят больше шаблонов к вашим миграциям. Небольшое замечание, но полезно при выполнении множества из них!

верблюжьего
источник
2
Это было не так в Laravel 5.0, Blueprintбыл добавлен в Laravel 5.1. Просто уточнение это все.
Фил Спаркс
@PhillSparks Вы правы, спасибо, что поймали мою ошибку. Я обновил, чтобы уточнить версию, в которой это можно использовать.
camelCase
24

Если вы используете Laravel 5, команда будет;

php artisan make:migration add_paid_to_users

Все команды для создания объектов (контроллеры, модели, миграции и т. Д.) Были перенесены под make:команду.

php artisan migrate все еще то же самое, хотя.

mikelovelyuk
источник
24

Ларавелла 5.6 и выше

в случае, если вы хотите добавить новый столбец как FOREIGN KEY к существующей таблице.

Создайте новую миграцию, выполнив эту команду: make: миграция

Пример :

php artisan make:migration add_store_id_to_users_table --table=users

В папке базы данных / миграции у вас есть новый файл миграции, что-то вроде:

2018_08_08_093431_add_store_id_to_users_table.php (см. Комментарии)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

После этого запустите команду:

php artisan migrate

Если по какой-либо причине вы хотите отменить последнюю миграцию, выполните следующую команду:

php artisan migrate:rollback

Вы можете найти больше информации о миграции в документации

chebaby
источник
1
Очень полный и актуальный ответ. Спасибо!
musicin3d
17

Вы можете добавить новые столбцы в начальный Schema::createметод следующим образом:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Если вы уже создали таблицу, вы можете добавить в нее дополнительные столбцы, создав новую миграцию и используя Schema::tableметод:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

В документации достаточно подробно об этом, и она не сильно изменилась с версии 3 до версии 4 .

tplaner
источник
Что-то не так. Я делаю "db: make", чтобы создать новый файл миграции. И затем я помещаю Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); внутрь. И запустите «php artisan migrate», но получите фатальную ошибку: Невозможно переопределить класс Users в /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php в строке 3
Ким Ларсен
Вы должны назвать каждую из миграций уникальной при их создании. Обычно первоначальный создать Назову create_users_table, то если я добавляю столбцов: add_email_password_columns_to_users.
tplaner
да, как говорит evolve, безусловно, лучше придерживаться оригинальной философии дизайна Laravel и использовать только add_глагол " " перед каждым файлом, чтобы отслеживать изменения. таким образом, легче отслеживать изменения для контроля версий и т. д., поскольку для каждой итерации создается новый файл добавления. Если бы вы просто пошли и продолжали изменять " create_", было бы трудно понять, что сотрудник x испортил что-то, удалив индекс, или добавив новый столбец и т. Д. И т. Д., По крайней мере, это имеет смысл в моей голове! :)
wired00
7

Вы можете просто изменить существующий файл миграции, например, добавив столбец в таблицу, а затем набрав в терминале:

$ php artisan migrate:refresh
Махана Делакур
источник
11
Обновление опустошит таблицу
JohnTaa
8
Это невероятно опасно - если некоторые люди запустят старую версию, у некоторых будет новая, и начнется хаос. В Liquibase, если вы отредактируете файл, он потерпит неудачу, если вы явно не добавите исключения, чтобы разрешить его, и вы можете сделать это только в очень немногих случаях. Например, если вы сделаете столбец ненулевым, если в какой-либо базе данных уже есть нулевые данные, он сломается.
Джон Литтл
3
Было бы лучше, если бы вы отредактировали свой ответ и упомянули, что он опустошит вашу таблицу, будет лучше.
Авель
Примечание. Эта команда очистит все таблицы базы данных , если вы хотите ее использовать, а затем создайте резервную копию базы данных
Udhav Sarvaiya,
5

это работает на laravel 5.1.

во-первых, на вашем терминале выполните этот код

php artisan make:migration add_paid_to_users --table=users

после этого перейдите в каталог вашего проекта и разверните базу данных каталога - перенесите и отредактируйте файл add_paid_to_users.php, добавьте этот код

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

после этого вернитесь в свой терминал и выполните эту команду

php artisan migrate

надеюсь, это поможет.

Росидин Бима
источник
5

Первый откат вашей предыдущей миграции

php artisan migrate:rollback

После этого вы можете изменить существующий файл миграции (добавить новые, переименовать или удалить столбцы), а затем повторно запустить файл миграции.

php artisan migrate
noobgrammer
источник
0

Несмотря на то, что, как уже упоминали другие, лучше всего использовать файл переноса, в крайнем случае вы также можете добавить столбец с тинкером.

$ php artisan tinker

Вот пример одной строки для терминала:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(Здесь он отформатирован для удобства чтения)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
mfink
источник