Cambio de tipo de campo de la tabla de migración de Laravel

6 minutos de lectura

avatar de usuario
naing linhtut

El siguiente es mi archivo 2015_09_14_051851_create_orders_table.php. Y quiero cambiar $table->integer('category_id'); como una cadena con nueva migración.

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

}

  • $table->string('category_id');

    – aldrin27

    5 de octubre de 2015 a las 2:43

  • no, quiero cambiar solo ese tipo usando otro archivo de migración 2015_10_05_021049_change_category_id_to_orders_table

    – naing linhtut

    5 de octubre de 2015 a las 2:44


avatar de usuario
mininoz

actualización: 31 de octubre de 2018, todavía se puede usar en laravel 5.7 https://laravel.com/docs/5.7/migrations#modificando-columnas

Para realizar algún cambio en la base de datos existente, puede modificar el tipo de columna utilizando change() en migración

Esto es lo que podrías hacer

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

tenga en cuenta que necesita agregar doctrina/dbal dependencia de composer.json para obtener más información, puede encontrarla aquí http://laravel.com/docs/5.1/migrations#modificando-columnas

  • Ahora estoy usando laravel 4.2

    – naing linhtut

    5 de octubre de 2015 a las 4:06

  • Todavía se puede usar en Laravel 5.5 para cualquiera que se pregunte. (ya que esta respuesta ya tiene algunos años)

    – Berto H.

    5 de junio de 2018 a las 8:04

  • Sí. Puedes consultarlo desde aquí Modificando Columna (Laravel 5.5)

    – mininoz

    6 de junio de 2018 a las 3:21

  • ¿Cómo puedo cambiar la cadena a int y agregar un valor predeterminado? Intenté esto pero PostgreSQL arroja un error de conversión. $table->integer('score')->default(0)->change();

    – bhattraideb

    23 de julio de 2020 a las 12:49

avatar de usuario
Francisco Corrales Morales

La solución estándar no funcionó para mí, al cambiar el tipo de TEXTO a TEXTO LARGO.

lo tenia que hacer asi:

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

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

Esto podría ser un problema de Doctrine. Más información aquí.

Otra forma de hacerlo es usar el método string() y establecer el valor en la longitud máxima del tipo de texto:

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

  • Esto es especialmente útil para las columnas DECIMAL.

    – dmmd

    9 de enero de 2017 a las 15:15

  • Puedo confirmar este comportamiento. Para cambiar una columna de texto a texto medio, tenía que hacer esto: $tabla->cadena(‘mensajes’, 16777215)->anulable()->cambiar();

    – Antonio

    12 de enero de 2018 a las 20:12


  • $table->longText('mycolumn')->change();

    – Rockin4Life33

    18 de marzo de 2019 a las 22:42

  • Esta es una buena solución, ya que las migraciones de Laravel no admiten cambiar ningún otro tipo de campo cuando hay otro campo ENUM en la misma tabla.

    – Thiago Elías

    28 sep 2019 a las 18:36

  • Pero no puede ejecutar la prueba.

    – Codificador de rayos

    16 de agosto de 2021 a las 3:32

Solución 2018, aún otras respuestas son válidas pero no necesitas usar ninguna dependencia:

Primero tienes que crear una nueva migración:

php artisan make:migration change_appointment_time_column_type

Luego en ese archivo de migración up()probar:

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

Si no cambia el tamaño predeterminado será varchar(191) pero si desea cambiar el tamaño del campo:

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

Luego migre el archivo por:

php artisan migrate

más información de doc.

  • ¿Todavía no necesita usar la dependencia “doctrine/dbal”?

    – Abhay Maurya

    21 de junio de 2019 a las 7:25

  • Esta, en mi opinión, es la única respuesta correcta. Debido al hecho de que los archivos de migración, además de su propósito principal para cambiar el esquema, son el medio para documentar y crear versiones de los cambios del esquema de la base de datos, el archivo de migración por separado es imprescindible aquí.

    – Valentín Shi

    13 de julio de 2019 a las 7:38


  • Todavía necesitas doctrine/dbal.

    – Theodore R. Smith

    18 oct 2019 a las 15:58

  • Se requiere el paquete doctrina/dbal.

    – golchha21

    21 de julio de 2020 a las 12:12

todas las demás respuestas son correctas Pero antes de correr

php artisan migrate

asegúrese de ejecutar este código primero

composer require doctrine/dbal

para evitar este error

RuntimeException: el cambio de columnas para los “elementos” de la tabla requiere Doctrine DBAL; instalar “doctrine/dbal”.

avatar de usuario
mehdi kord

El primer compositor requiere doctrine/dbaldespués:

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

avatar de usuario
Luis

No es realmente una respuesta, sino solo una nota sobre ->change():

Solo se pueden “cambiar” los siguientes tipos de columnas: bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger y unsignedSmallInteger.

https://laravel.com/docs/5.8/migrations#modificando-columnas

Si su columna no es una de estas, deberá soltar la columna o usar la declaración de modificación como se menciona en otras respuestas.

avatar de usuario
Francisco Corrales Morales

Para mí, la solución fue simplemente reemplazar no firmado con índice

Este es el código completo:

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad