我继承了一个没有迁移的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 ...')
类型语句,但我想使用包装器方法addIndex
,removeIndex
等。
有人可以解释如何使这些功能正常工作吗?
答案 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迁移中传递表名。