Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel db迁移-重命名列错误-请求未知数据库类型枚举_Php_Mysql_Laravel_Laravel 4_Migration - Fatal编程技术网

Php Laravel db迁移-重命名列错误-请求未知数据库类型枚举

Php Laravel db迁移-重命名列错误-请求未知数据库类型枚举,php,mysql,laravel,laravel-4,migration,Php,Mysql,Laravel,Laravel 4,Migration,我使用的是Laravel4.2。在我的composer.json中加载了以下库 "doctrine/dbal": "2.4.*", 我创建了以下迁移: class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration { public function up() { Schema::table('order_header', function(Blueprint $table)

我使用的是Laravel
4.2
。在我的
composer.json中加载了以下库

"doctrine/dbal": "2.4.*",
我创建了以下迁移:

class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration {

    public function up()
    {
        Schema::table('order_header', function(Blueprint $table)
        {
            $table->renameColumn('delivery_notes', 'packing_notes');
        });
    }

}
其中,
delivery\u notes
列类型为
text

运行迁移时,出现以下错误:

[Doctrine\DBAL\DBALException]请求了未知的数据库类型枚举, 条令\DBAL\Platforms\MySqlPlatform可能不支持它

知道我为什么会犯这个错误吗?我该如何着手解决这个问题?我需要重命名表中的一列。有没有其他方法可以重命名该列?

说:

注意:不支持重命名
枚举
列类型

在这里:

你可以找到一些解决这个问题的方法。既然你说这个专栏不是
enum
,那么看看@upngo的评论:

“…问题是重命名具有
enum
的表中的任何列。”

我还发现这篇文章关注这个问题,并提出了一个可能对您有所帮助的选项


您可以将自定义构造函数添加到迁移中,并向条令解释枚举应被视为字符串

public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
    parent::__construct($version);

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}

这对我来说在Laravel 5.1上是有效的

我在Laravel 5.1.19版(LTS)中遇到了这个问题。这对于早期版本也是实际的。 我想在根据之前的评论解决问题时通知您

首先,我尝试了迁移文件中的下一个代码:

$table->renameColumn('column_name');
但是在命令
php artisan migrate
之后,我遇到了下一个错误:

[Symfony\Component\Debug\Exception\FatalErrorException]类 未找到“条令\DBAL\Driver\pdomsql\Driver”

正如您所知,DBAL已从laravel核心中删除,我们需要将其添加到composer.json中(例如:
“require”:{“doctrine/DBAL”:“2.5.1”}
)。 我将DBAL设置为所需,并再次尝试执行migrate命令,但出现下一个错误:

[条令\DBAL\DBALException]
请求了未知的数据库类型枚举, 条令\DBAL\Platforms\MySqlPlatform可能不支持它

然后,我在迁移文件中尝试了下一个原始sql: 对于
up()

对于
down()

它是有效的

另外,要重命名包含枚举字段的表中的其他字段,我们应该
对原始sql使用与前面评论中所述相同的模式。

我对Laravel5.1和PostGres也有同样的问题。 因此,基本上我使用了
DB::statement
来创建枚举并解决问题:

语句(“创建类型e_用户为ENUM('data1','data2')”

然后:

语句(“ALTERTABLE users添加列e_users”)


以下是Laravel 5.2.45+的答案(可能也适用于5.1,尚未测试或检查,请让我知道,以便我可以更新此问题。)

在up方法中添加此行:

Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
大概是这样的:

public function up()
{
    Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    Schema::table('users', function (Blueprint $table) {
         $table->text('bio')->change();
    });
}

尽管原作者对Laravel 4有问题,这可以在Laravel 5中安全地解决,方法是将
composer.json中的
原则/dbal
版本升级到
^2.6
,就像在2.6.0版中修复的那样


请确保检查
中是否存在破坏兼容性的更改目前,除了避免枚举之外,没有解决此问题的法律解决方案,但有一个解决方法:

使用以下内容创建迁移:

public function up()
{
    DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}
这将完成您正在寻找的枚举更新。此外,您还可以创建句柄关闭函数,将字段状态恢复为以前的状态:

 public function down() 
 {
     DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');"); 
 }

我相信这个错误是由另一次迁移引起的,而不是这次迁移。看看您已经运行和尚未运行的迁移。在此之前,我没有其他迁移可以运行。已检查。在当前版本中似乎不可行?我是在Laravel 5.1上的,这里是在Laravel 5.2上的。您是否将其放入某种引导文件中?不,您应该从迁移文件中运行它,最好使用构造方法。请注意,这会使列现在作为字符串而不是枚举工作,因此允许保存任何字符串。@Meriw当要重命名的列本身不是
enum()时
,与OP的问题一样,此方法不会将表上的任何
ENUM()
列更改为字符串类型或其他类型;它只影响要重命名的列。@BenJohnson
public function up()
{
    Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    Schema::table('users', function (Blueprint $table) {
         $table->text('bio')->change();
    });
}
public function up()
{
    DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}
 public function down() 
 {
     DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');"); 
 }