web-dev-qa-db-fra.com

Les migrations Laravel changent un type de colonne de varchar à longText

J'ai besoin de changer avec le type de colonne de migration de $table->string('text'); en un type de texte. J'ai essayé de le faire de plusieurs manières, mais aucune d'entre elles n'a fonctionné. Est-il possible de le faire en une seule migration? J'imagine que je peux supprimer la colonne, puis la recréer avec un nouveau type, mais je me demande s'il est possible de le faire en une seule migration.

14
Marco

Oui, vous pouvez créer une nouvelle migration et changer un seul type de colonne :

public function up()
{
    Schema::table('sometable', function (Blueprint $table) {
        $table->text('text')->change();
    });
}
20
Alexey Mezenin

Selon Laravel Doc

Tu peux le faire comme

Schema::table('yourTable', function (Blueprint $table) {
    $table->text('text')->change();
});

assurez-vous d'ajouter la dépendance doctrine/dbal à votre fichier composer.json

6
zorx

C'est possible avec une migration TABLE.

Comme mentionné dans d'autres publications, veillez à exécuter composer install doctrine/dbal à partir de la racine de votre projet.

Ceux-ci sont mis en place avec:

php artisan make:migration alter_table_[yourtablenamehere]_change_[somecolumnname] --table=[yourtablenamehere]

depuis la racine de votre projet.

De la documentation:

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

class AlterTableSomething extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('table', function (Blueprint $table) {
            $table->text('column_name')->change();
        });
    }
}

Si vous obtenez une erreur de suivi en utilisant change()

Enum demandé le type de base de données inconnu demandé, Doctrine\DBAL\Platforms\MySQL80Platform peut ne pas le prendre en charge. 

cela signifie qu'il existe une colonne (pas nécessairement modifiée) dans votre table qui a le type enum. Vous pouvez donc utiliser la fonction suivante à la place de change():

public function changeColumnType($table, $column, $newColumnType) {                
    DB::statement("ALTER TABLE $table CHANGE $column $column $newColumnType");
} 

Et utilisez-le comme ça: $this->changeColumnType('sometable','text','TEXT');

1
Kamil Kiełczewski