Carol.Kar
Carol.Kar

Reputation: 5355

Laravel 8 - Change existing migration

I am developing on Laravel Framework 8.33.1 and have the following migration on my local environment and also in production.

class CreateCompanyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('company', function (Blueprint $table) {
            $table->id();
            $table->integer('company_id');
            $table->integer('messageId');
            $table->string('url');
            $table->timestamps();

            /**
            New table:
            $table->id();
            $table->integer('company_id')->nullable($value = true);
            $table->integer('messageId');
            $table->integer('people_id')->nullable($value = true);
            $table->string('url')->nullable($value = true);
            $table->timestamps();
             */
        });
    }

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

I would like to change the migration with the following adapted fields:

            $table->id();
            $table->integer('company_id')->nullable($value = true);
            $table->integer('messageId');
            $table->integer('people_id')->nullable($value = true);
            $table->string('url')->nullable($value = true);
            $table->timestamps();

As I am using the current migration in production I do not want to lose data.

I simply tried to modify the migration file with my new table definition, but I get:

> php artisan migrate
Nothing to migrate.

Any suggestions how to change the migration properly in laravel?

I appreciate your replies!

Upvotes: 1

Views: 2316

Answers (2)

gaidyjg
gaidyjg

Reputation: 301

If you don't mind losing data and you are in development mode, you can do php artisan migrate:rollback and after execute: php artisan migrate. So your migrations works correctly. You can to read more here.

Now, if you just want to add new tables and modify others in you database, you should make another migration. But before this, you should to install doctrine/dbal to be able to modify your tables correctly, or else, it will give you many errors. After, add this lines in your config/database.php

use Illuminate\Database\DBAL\TimestampType;

'dbal' => [
    'types' => [
        'timestamp' => TimestampType::class,
    ],
],

Now you can do: php artisan make:migration add_new_tables_to_company and your file in database/migrations.

class AlterCompanyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('company', function (Blueprint $table) {
            $table->integer('company_id')->nullable()->change();
            $table->integer('people_id')->nullable();
            $table->string('url')->nullable()->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('company', function (Blueprint $table) {
            $table->integer('company_id')->nullable(false)->change();
            $table->dropColumn('people_id');
            $table->string('url')->nullable(false)->change();
        });
    }
}

Upvotes: 0

jrcamatog
jrcamatog

Reputation: 1484

To modify an existing table, create a new migration.

php artisan make:migration alter_company_table

class AlterCompanyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('company', function (Blueprint $table) {
            $table->integer('company_id')->nullable()->change();
            $table->integer('people_id')->nullable();
            $table->string('url')->nullable()->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('company', function (Blueprint $table) {
            $table->integer('company_id')->nullable(false)->change();
            $table->dropColumn('people_id');
            $table->string('url')->nullable(false)->change();
        });
    }
}

Upvotes: 2

Related Questions