Изменение типа поля таблицы миграции Laravel

Ниже мой файл 2015_09_14_051851_create_orders_table.php. И я хочу изменить $table->integer('category_id'); как строка с новой миграцией.

<?php

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

class CreateOrdersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('orders', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('num');
            $table->integer('user_id');

            $table->text('store_name');
            $table->integer('store_name_publication');

            $table->string('postal_code', 255);
            $table->string('phone_number', 255);

            $table->text('title');
            $table->text('description');

            $table->string('list_image_filename1', 255);
            $table->string('list_image_filename2', 255)->nullable();
            $table->string('list_image_filename3', 255)->nullable();
            $table->string('list_image_filename4', 255)->nullable();
            $table->string('list_image_filename5', 255)->nullable();

            $table->integer('term');

            $table->datetime('state0_at')->nullable();
            $table->datetime('state1_at')->nullable();
            $table->datetime('state2_at')->nullable();
            $table->datetime('state3_at')->nullable();
            $table->datetime('state4_at')->nullable();
            $table->datetime('state5_at')->nullable();
            $table->datetime('state6_at')->nullable();
            $table->datetime('state7_at')->nullable();
            $table->datetime('state8_at')->nullable();
            $table->datetime('state9_at')->nullable();
            $table->datetime('state10_at')->nullable();

            $table->integer('category_id');
            $table->integer('target_customer_sex');
            $table->integer('target_customer_age');

            $table->integer('payment_order');
            $table->integer('num_comment');
            $table->integer('num_view');
            $table->string('num_pop');

            $table->integer('money');
            $table->integer('point');

            $table->datetime('closed_at');
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('orders');
    }

}

Ответы

Ответ 1

обновление: 31 октября 2018 г., по-прежнему может использоваться на laravel 5.7 https://laravel.com/docs/5.7/migrations#modifying-columns

Чтобы внести некоторые изменения в существующую базу данных, вы можете изменить тип столбца, используя change() при переносе.

Это то, что вы могли бы сделать

Schema::table('orders', function ($table) {
    $table->string('category_id')->change();
});

пожалуйста, обратите внимание, что вам нужно добавить зависимость doctrine/dbal в composer.json, для получения дополнительной информации вы можете найти ее здесь http://laravel.com/docs/5.1/migrations#modifying-columns

Ответ 2

Стандартное решение у меня не сработало при смене типа с TEXT на LONGTEXT.

Мне пришлось это так:

public function up()
{
    DB::statement('ALTER TABLE mytable MODIFY mycolumn  LONGTEXT;');
}

public function down()
{
    DB::statement('ALTER TABLE mytable MODIFY mycolumn TEXT;');
}

Это может быть проблемой доктрины. Больше информации здесь.

Еще один способ сделать это - использовать метод string() и установить значение для максимальной длины текстового типа:

    Schema::table('mytable', function ($table) {
        // Will set the type to LONGTEXT.
        $table->string('mycolumn', 4294967295)->change();
    });

Ответ 3

Решение 2018, все еще другие ответы верны, но вам не нужно использовать какую-либо зависимость:

Сначала вы должны создать новую миграцию:

php artisan make:migration change_appointment_time_column_type

Затем в этом файле миграции up() попробуйте:

    Schema::table('appointments', function ($table) {
        $table->string('time')->change();
    });

Если вы не измените размер, по умолчанию будет varchar(191) но если вы хотите изменить размер поля:

    Schema::table('appointments', function ($table) {
        $table->string('time', 40)->change();
    });

Затем перенесите файл:

php artisan migrate

больше информации от док.

Ответ 4

Для меня решение было просто заменить без знака на индекс

Это полный код:

    Schema::create('champions_overview',function (Blueprint $table){
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->integer('cid')->index();
        $table->longText('name');
    });


    Schema::create('champions_stats',function (Blueprint $table){
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->integer('championd_id')->index();
        $table->foreign('championd_id', 'ch_id')->references('cid')->on('champions_overview');
    });

Ответ 5

все остальные ответы верны, но перед тем как бежать

php artisan migrate

убедитесь, что вы запускаете этот код первым

composer require doctrine/dbal

чтобы избежать этой ошибки

RuntimeException: изменение столбцов для "элементов" таблицы требует Doctrine DBAL; установить "доктрину/дбал".