Agregar una nueva columna a la tabla existente en una migración

270

No puedo entender cómo agregar una nueva columna a mi tabla de base de datos existente usando el marco Laravel.

Traté de editar el archivo de migración usando ...

<?php

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

En terminal, ejecuto php artisan migrate:instally migrate.

¿Cómo agrego nuevas columnas?

Kim Larsen
fuente
Sería útil si pudiera incluir cualquier error que esté recibiendo; ¿Qué esperas que pase? y que pasa realmente?
Phill Sparks
9
Gran pregunta Existe mucha documentación de migración, y le muestra la API y cómo crear tablas LA PRIMERA VEZ. Entonces todo falla a medida que desarrolla su aplicación más y necesita modificar su estructura de base de datos.
Andrew Koper

Respuestas:

611

Para crear una migración, puede usar el comando migrate: make en la CLI de Artisan. Use un nombre específico para evitar chocar con modelos existentes

para Laravel 3:

php artisan migrate:make add_paid_to_users

para Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Luego debe usar el Schema::table()método (ya que está accediendo a una tabla existente, no creando una nueva). Y puede agregar una columna como esta:

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

y no olvides agregar la opción de reversión:

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('paid');
    });
}

Entonces puedes ejecutar tus migraciones:

php artisan migrate

Todo esto está bien cubierto en la documentación de ambos Laravel 3:

Y para Laravel 4 / Laravel 5:

Editar:

use $table->integer('paid')->after('whichever_column');para agregar este campo después de una columna específica.

Phill Sparks
fuente
3
Justphp artisan migrate
Phill Sparks
Algo está mal. Hago "db: make" para hacer un nuevo archivo de migración. Y luego puse Schema :: table ('usuarios', función ($ tabla) {$ tabla-> entero ('pagado');}); en ello. Y ejecute "php artisan migrate", pero obtiene un error fatal: no se puede volver a declarar usuarios de clase en /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php en la línea 3
kim larsen
La creación de migraciones también está cubierta en la documentación. Debes darle un nombre más específico, como "add_paid_to_users", de esta forma no chocará con el choque de tu modelo.
Phill Sparks
Parece que cualquier URL de documento de Laravel 3 está redirigiendo a los documentos de Laravel 4. Aquí están los enlaces a los 3 documentos para el generador de esquemas y las migraciones
66
A partir de Laravel 5, este comando ahora seríaphp artisan make:migration add_paid_to_users
mikelovelyuk
64

Agregaré la respuesta de mike3875 para futuros lectores que utilicen Laravel 5.1 y posteriores.

Para hacer las cosas más rápido, puede usar la bandera "--table" de esta manera:

php artisan make:migration add_paid_to_users --table="users"

Esto agregará el contenido del método upy downautomáticamente:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

Del mismo modo, puede usar la --create["table_name"]opción al crear nuevas migraciones que agregarán más repeticiones a sus migraciones. Pequeño punto, pero útil cuando se hacen muchos de ellos.

el caso de Carmel
fuente
2
Ese no fue el caso en Laravel 5.0, Blueprintse agregó en Laravel 5.1. Solo un punto de aclaración es todo.
Phill Sparks
@PhillSparks Tienes razón, gracias por descubrir mi error. He actualizado para aclarar la versión en la que se puede usar.
camelCase
24

Si está utilizando Laravel 5, el comando sería;

php artisan make:migration add_paid_to_users

Todos los comandos para hacer cosas (controladores, modelos, migraciones, etc.) se han movido bajo el make:comando.

php artisan migrate Sin embargo, sigue siendo el mismo.

mikelovelyuk
fuente
24

laravel 5.6 y superior

en caso de que desee agregar una nueva columna como CLAVE EXTRANJERA a una tabla existente.

Cree una nueva migración ejecutando este comando: make: Migration

Ejemplo:

php artisan make:migration add_store_id_to_users_table --table=users

En la carpeta de base de datos / migraciones tiene un nuevo archivo de migración, algo como:

2018_08_08_093431_add_store_id_to_users_table.php (ver los comentarios)

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

Después de eso ejecuta el comando:

php artisan migrate

En caso de que desee deshacer la última migración por algún motivo, ejecute este comando:

php artisan migrate:rollback

Puede encontrar más información sobre migraciones en los documentos

chebaby
fuente
1
Respuesta muy completa y relevante. ¡Gracias!
musicin3d
17

Puede agregar nuevas columnas dentro del Schema::createmétodo inicial como este:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Si ya ha creado una tabla, puede agregar columnas adicionales a esa tabla creando una nueva migración y utilizando el Schema::tablemétodo:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

La documentación es bastante exhaustiva sobre esto, y no ha cambiado demasiado de la versión 3 a la versión 4 .

tplaner
fuente
Algo está mal. Hago "db: make" para hacer un nuevo archivo de migración. Y luego puse Schema :: table ('usuarios', función ($ tabla) {$ tabla-> entero ('pagado');}); en ello. Y ejecute "php artisan migrate", pero obtiene un error grave: no se puede volver a declarar usuarios de clase en /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php en la línea 3
kim larsen
Debería nombrar cada una de las migraciones como algo único al crearlas. Normalmente, el primer crear Voy a nombrar create_users_table, entonces si estoy añadiendo columnas: add_email_password_columns_to_users.
tplaner
sí, como dice evolucionar, seguramente es mejor seguir con las filosofías de diseño originales de laravel y solo usar el add_verbo " " al frente de cada archivo para realizar un seguimiento de los cambios. de esta manera es más fácil rastrear los cambios para el control de versiones, etc. porque se crea un nuevo archivo de adición para cada iteración. Si simplemente fue y siguió modificando el " create_", sería difícil saber que x empleado, había estropeado algo al eliminar un índice o agregar una nueva columna, etc., ¡al menos eso tiene sentido en mi cabeza! :)
wired00
7

simplemente puede modificar su archivo de migración existente, por ejemplo agregando una columna en su tabla, y luego en su terminal escribiendo:

$ php artisan migrate:refresh
Mahana Delacour
fuente
11
Actualizar
vaciará
8
Esto es increíblemente peligroso: si algunas personas han ejecutado la versión anterior, algunas tendrán la nueva y se producirá el caos. En Liquibase, si edita un archivo, fallará a menos que especifique excepciones para permitirlo, y solo puede hacerlo en muy pocos casos. Por ejemplo, si hace que una columna no sea nula cuando alguna base de datos ya tiene datos nulos, se romperá.
John Little
3
Sería mejor, si edita su respuesta y menciona que vaciaría su tabla, sería mejor.
Abel
Nota: Este comando limpiará las tablas de bases de datos completas , si desea usarlas, primero
haga una
5

esto se trabaja en laravel 5.1.

primero, en su terminal ejecute este código

php artisan make:migration add_paid_to_users --table=users

después de eso, vaya al directorio de su proyecto y expanda la base de datos del directorio: migración y edite el archivo add_paid_to_users.php, agregue este código

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

después de eso vuelve a tu terminal y ejecuta este comando

php artisan migrate

espero que esto ayude.

Rosidin Bima
fuente
5

Primero revierta su migración anterior

php artisan migrate:rollback

Después de eso, puede modificar su archivo de migración existente (agregar nuevas, renombrar o eliminar columnas) y luego volver a ejecutar su archivo de migración

php artisan migrate
noobgrammer
fuente
0

Aunque un archivo de migración es la mejor práctica, como han mencionado otros, en un apuro también puede agregar una columna con tinker.

$ php artisan tinker

Aquí hay un ejemplo de una línea para la terminal:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(Aquí está formateado para facilitar la lectura)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
mfink
fuente