Symfony2: Doctrine で ENUM や SET, VARBINARY, TINYBLOB を有効にする方法
0 notes
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.yml
の doctrine.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 を見てみると VARBINARY
と TINYBLOB
もサポートされてないから追加されている。
というわけで、最終的な 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