Laravel migration table field's type change

PhpLaravelMigration

Php Problem Overview


Following is my file 2015_09_14_051851_create_orders_table.php. And I want to change $table->integer('category_id'); as a string with new migration.

<?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');
	}

}

Php Solutions


Solution 1 - Php

update: 31 Oct 2018, Still usable on laravel 5.7 https://laravel.com/docs/5.7/migrations#modifying-columns

To make some change to existing db, you can modify column type by using change() in migration.

This is what you could do

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

please note you need to add doctrine/dbal dependency to composer.json for more information you can find it here http://laravel.com/docs/5.1/migrations#modifying-columns

Solution 2 - Php

The standard solution didn't work for me, when changing the type from TEXT to LONGTEXT.

I had to it like this:

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

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

This could be a Doctrine issue. More information here.

Another way to do it is to use the string() method, and set the value to the text type max length:

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

Solution 3 - Php

2018 Solution, still other answers are valid but you dont need to use any dependency:

First you have to create a new migration:

php artisan make:migration change_appointment_time_column_type

Then in that migration file up(), try:

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

If you donot change the size default will be varchar(191) but If you want to change size of the field:

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

Then migrate the file by:

php artisan migrate

more info from doc.

Solution 4 - Php

all other answers are Correct But Before you run

php artisan migrate

make sure you run this code first

composer require doctrine/dbal

to avoid this error

> RuntimeException : Changing columns for table "items" requires Doctrine DBAL; install "doctrine/dbal".

Solution 5 - Php

First composer requires doctrine/dbal, then:

$table->longText('column_name')->change();

Solution 6 - Php

Not really an answer, but just a note about ->change():

> Only the following column types can be "changed": bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger and unsignedSmallInteger.

https://laravel.com/docs/5.8/migrations#modifying-columns

If your column isn't one of these you will need to either drop the column or use the alter statement as mentioned in other answers.

Solution 7 - Php

For me the solution was just replace unsigned with index

This is the full code:

    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');
    });

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionnaing linhtutView Question on Stackoverflow
Solution 1 - PhpmininozView Answer on Stackoverflow
Solution 2 - PhpFrancisco Corrales MoralesView Answer on Stackoverflow
Solution 3 - PhpBlasankaView Answer on Stackoverflow
Solution 4 - PhpHussam AdilView Answer on Stackoverflow
Solution 5 - PhpMehdi KordView Answer on Stackoverflow
Solution 6 - PhplewisView Answer on Stackoverflow
Solution 7 - PhpAhmed SafadiView Answer on Stackoverflow