未找到Symfony 3 addIndex的Doctrine Migrations。为什么呢?

时间:2017-07-17 16:06:23

标签: php symfony doctrine-orm database-migration

我继承了一个没有迁移的Symfony 3项目。

documentation之后,我将Doctrine Migrations Bundle添加到Symfony。

$ composer require doctrine/doctrine-migrations-bundle "^1.0"

将配置添加到config.yml

doctrine_migrations:
    dir_name: "%kernel.root_dir%/DoctrineMigrations"
    namespace: Application\Migrations
    table_name: migration_versions
    name: Application Migrations

然后将加载程序添加到appKernel.php

new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),

控制台现在显示了doctrine:migrations:*作为可用功能,因此我生成了我的迁移文件

php bin/console doctrine:migrations:generate 
Generated new migration class to "/path/to/project/app/DoctrineMigrations/Version20100621140655.php"

然后继续跟随Doctrine migrations documentation

public function up(Schema $schema)
{
    // alter my table
    $options = ['fields' => ['type_id']];
    $schema->addIndex('advertiser', 'idx_type_id', $options);
    ...
}

现在,当我运行迁移时:

Migrating up to 20170714165306 from 20170714155549

++ migrating 20170714165306

[Symfony\Component\Debug\Exception\UndefinedMethodException]                                                                                                                
Attempted to call an undefined method named "addIndex" of class "ProxyManagerGeneratedProxy\__PM__\Doctrine\DBAL\Schema\Schema\Generatedaca9b50393335f8354881e485c485329".  

现在当我收到错误时,我搜索了它并找到了ocramius / ProxyManager。我用

安装了它
composer require ocramius/proxy-manager "^2.0"

仍然有同样的错误。

当然,在大多数Doctrine Migrations文档中,我主要看到addSql( 'ALTER TABLE ...')类型语句,但我想使用包装器方法addIndexremoveIndex等。

有人可以解释如何使这些功能正常工作吗?

1 个答案:

答案 0 :(得分:1)

我发现了我的问题。通过在迁移文件中执行以下操作来解决此问题:

public function up(Schema $schema)
{
    // alter my table
    $table = $schema->getTable('advertiser');
    $table->addIndex(['type_id'], 'idx_type_id');
    ...
}

基本思想是你需要获取对表的引用,然后你可以将addIndex添加到表上的特定列。与Doctrine文档相反,您可以在$ Schem引用上添加addIndex,并在Symfony2 / 3迁移中传递表名。