ARTICLE

Symfony2: Doctrine で ENUM や SET, VARBINARY, TINYBLOB を有効にする方法

SQL でデータベースにテーブルを作成して、データベースからマッピング用の YAML に変換するところやってた。 これらのテーブルには ENUM 型を含むテーブルもあり、doctrine:mapping:convert yml でエラーが発生した。

データベースを作成する。

$ php app/console doctrine:database:create
Created database for connection named `testdb`

データベースにテーブルを作成する。

$ mysql -u user -D testdb < init.sql

既存データベースをマッピング用に YAML 形式に変換。

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


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

ENUM を未知のデータベース型だと吠えているので、どうにかして教えこまないといけない。

調べてみると php - How to enable ENUMs in Symfony 2 / Doctrine - Stack Overflow がヒットして、この答えが非常に参考になった。

app/config/config.ymldoctrine.dbal セクションに mapping_types.enum = string を追加すれば良いみたい。

# Doctrine Configuration
doctrine:
    dbal:
        ~~~~
        mapping_types:
            enum:       string

これにより、DBAL によってデフォルトでサポートされていない ENUM 型を string と対応付けることができる。

マッピングタイプには ENUM 以外にも追加しておくと幸せになれるんじゃない?っていう型があるみたい。
Deal with MySQL types natively unsupported by Doctrine2 を見てみると VARBINARYTINYBLOB もサポートされてないから追加されている。

というわけで、最終的な app/config/config.yml はこんな感じ。

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8
        # if using pdo_sqlite as your database driver, add the path in parameters.yml
        # e.g. database_path: %kernel.root_dir%/data/data.db3
        # path:     %database_path%
        mapping_types:
            enum:       string
            set:        string
            varbinary:  string
            tinyblob:   text

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

ここまでやったら再度、doctrine:mapping:convert yml を実行する。

そして変換された YAML を使って、エンティティクラスにインポートする。

php app/console doctrine:mapping:import AcmeTestDBBundle annotation

参考

最後まで読んでいただきありがとうございました。
この記事が気に入っていただけたらシェアしてくれるとブログ運営の励みなります。
blog comments powered by Disqus

Categories