Symfony2のdoctrine2をenumに対応させる

doctrine2がenumに対応していないので、既存のデータベースからEntityを作ろうとした時にエラーが出ることがあります。

$ php app/console doctrine:mapping:convert yml ./src/Test/HogeBundle/Resources/config/doctrine/metadata/orm --from-database --force

  [Doctrine\DBAL\DBALException]
  Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

その場合は、doctrine2のドキュメントによると、enumをstringに関連づければ良いようです。

Mysql Enums — Doctrine 2 ORM 2.1 documentation

BundleのbootでEntityManagerを取得して、マッピングを行います。

<?php

namespace Test\HogeBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class TestHogeBundle extends Bundle
{
    public function boot() {
        $em = $this->container->get('doctrine.orm.default_entity_manager');
        $conn = $em->getConnection();
        $conn->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    }
}

他の方法として、Enumタイプを作成して関連付けることもできるようです。

※追記

app/config/config.phpに書く方法が紹介されていました。

Doctrine の DBAL レイヤーの使用方法 | Symfony2日本語ドキュメント

$container->loadFromExtension('doctrine', array(
    'dbal' => array(
        'connections' => array(
            'default' => array(
                'mapping_types' => array(
                    'enum'  => 'string',
                ),
            ),
        ),
    ),
));

試していませんが、これでもいいらしいです。


タグ: , ,

新しく会社作りました!

コメントをどうぞ