Додайте новий стовпець до наявної таблиці під час міграції


270

Я не можу зрозуміти, як додати новий стовпець до моєї існуючої таблиці бази даних за допомогою Laravel Framework.

Я спробував редагувати файл міграції за допомогою ...

<?php

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

У терміналі я виконую php artisan migrate:installі migrate.

Як додати нові стовпці?


Було б корисно, якщо ви могли б включити будь-які помилки, які ви отримуєте; що ви очікуєте, що трапиться; і що насправді відбувається?
Phill Sparks

9
Чудове запитання. Існує багато міграційної документації там, і вона показує вам API і як створити таблиці ПЕРШИЙ ЧАС. Тоді все не вдається, коли ви більше розробляєте додаток і потрібно змінювати структуру db.
Андрій Копер

Відповіді:


609

Щоб створити міграцію, ви можете використовувати міграцію: виконайте команду в Artisan CLI. Використовуйте конкретну назву, щоб уникнути зіткнень із існуючими моделями

для 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 ('користувачі', функція ($ table) {$ table-> integer ('paid');}); в це. І запустіть "php artisan migrage", але отримувати Fatal error: Неможливо передекларувати користувачів класу в /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php на лінії 3
kim larsen

Створення міграцій також висвітлено в документації. Ви повинні дати йому більш конкретне ім’я, наприклад, "add_paid_to_users", таким чином воно не зіткнеться з вашою моделлю зіткнення.
Phill Sparks

Здається, що будь-яка URL-адреса Laravel 3 перенаправляє на документи Laravel 4. Ось посилання на 3 doc для

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. Просто точкою уточнення є все.
Phill Sparks

@PhillSparks Ви маєте рацію, дякую, що ви зрозуміли мою помилку. Я оновив, щоб уточнити версію, в якій це можна використовувати.
camelCase

24

Якщо ви використовуєте Laravel 5, командою буде;

php artisan make:migration add_paid_to_users

Усі команди для створення елементів (контролери, моделі, міграції тощо) переміщені під make:команду.

php artisan migrate все одно те саме.


24

laravel 5.6 і вище

на випадок, якщо ви хочете додати новий стовпець як ЗАМОВНИЙ КЛЮЧ до існуючої таблиці.

Створіть нову міграцію, виконавши цю команду: make: migration

Приклад:

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

Більше інформації про міграції можна знайти в документах


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 .


Щось не так. Я роблю "db: make", щоб створити новий файл міграції. І тоді я кладу Schema :: table ('користувачі', функція ($ table) {$ table-> integer ('paid');}); в це. І запустіть "php artisan migrage", але отримує Fatal error: Неможливо передекларувати користувачів класу в /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php на лінії 3
кім larsen

Ви повинні назвати кожну з міграцій чимось унікальним під час їх створення. Зазвичай початковий створити Назву create_users_table, то якщо я додаю стовпців: add_email_password_columns_to_users.
tplaner

так, як говорить еволюція, безумовно, краще дотримуватися оригінальної філософії дизайну laravel і використовувати лише add_дієслово перед кожним файлом, щоб відслідковувати зміни. таким чином простіше відстежувати зміни для контролю версій тощо, оскільки для кожної ітерації створюється новий файл додавання. Якщо ви просто пішли і продовжували змінювати " create_", було б важко знати, що x-співробітник, щось зіпсував, видаливши індекс, додавши новий стовпчик тощо тощо, принаймні, це має сенс у моїй голові! :)
wired00

7

ви можете просто змінити існуючий файл міграції, наприклад додати стовпець у свою таблицю, а потім у термінал набравши:

$ php artisan migrate:refresh

11
Оновлення спорожнить стіл
JohnTaa

8
Це неймовірно небезпечно - якщо у деяких людей буде запущена стара версія, у деяких буде нова, і настане хаос. Якщо ви відредагуєте файл у Liquibase, він не вдасться, якщо ви явно не покладете винятки, щоб це дозволили, і це можна зробити лише в дуже небагатьох випадках. Наприклад, якщо ви зробите стовпець не-null, коли якась база даних вже містить нульові дані, вона порушиться.
Джон Літтл

3
Було б краще, якби ви відредагували свою відповідь і зазначили, що вона спорожнить ваш стіл, було б краще.
Абель

Примітка: Ця команда очистить цілі таблиці баз даних , якщо ви хочете її використовувати, то спершу
створіть

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

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'); 
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.