Doctrine 2 DBALの型マッピング
-
20-12-2019 - |
質問
私のプロジェクトのためのDoctrineのDBAL部分のみを使用しています。だから私は自分でマッピングを気にかけなければなりません。 Doctrineは、ここで読むことができるように、Doctrineが一般的なPHPタイプにデータベースの種類を除算することを考え出しました[1]。
今私はDoctrineがDBタイプTinyint(4)をブール値にマッピングするという事実に遭遇しました。 MySQLのマニュアルによるとTinyInt(1)のみがBoolean [2]と同じです。私のプロジェクトはMySQLIからDoctrineへ移動するのが好きなレガシー1であるため、ネイティブのDBタイプに固執する必要があります。
私の質問は、DoctrineからネイティブDBタイプを取得する方法ですか?
あなたの助けを持っています。
ステファノ
[1] http:// docs .doctrine-project.org /プロジェクト/ doctrine-dbal / en /最新/リファレンス/ typess.html [2] http://dev.mysql.com/ doc / refman / 5.0 / en / numeric-type-overview.html
解決
Doctrine Issue Trackerのレポートを開き、理由を理解するのはそのように機能します。答えは簡単です:
Tinyintの長さは、保存できる値のサイズについては何も言わない。いずれの場合は1バイトですが、このオプションを使用する場合に備えて充填ゼロを効果的にします。
Doctrine MySQLは独自のブール型を提供していないため、自分のブールタイプをMySQL TinyInt型にマッピングします。
詳細については、チケットについてもっと読むことができます。
他のヒント
レガシーMySQL DBをDoctrineにマッピングする人は、TinyInt(4)
を扱うときに見逃すことが簡単な一般的な問題の解決策を見つけました。tl; dr
フィールドマッピングにおけるdefault: '1'
を
is_active:
type: boolean
options:
default: true
nullable: true
.
長いバージョン
レガシーDBには、以下のDB構造がありました。 tinyint(4)のis_active
欄
CREATE TABLE IF NOT EXISTS `foo_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...
`is_active` tinyint(4) DEFAULT '1',
...
.
次のコマンドを実行した後
php app/console doctrine:mapping:import --force AcmeDemoBundle yml
php app/console doctrine:generate:entities AcmeDemoBundle
.
とphp app/console doctrine:schema:update --dump-sql
を実行している間
私は
ALTER TABLE foo_table CHANGE is_active is_active TINYINT(1) DEFAULT NULL;
.
既存のDBを修正することはできませんでした(しかし、問題を解決しなかったことで、私はまだこのdiffを得ていました)
YMLマッピングは以下のフィールド定義
を後述しましたis_active:
type: boolean
nullable: true
default: '1'
column: is_active
.
私は
で試したis_active:
columnDefinition: "TINYINT(4)"
nullable: true
default: '1'
column: is_active
.
成功せずに、プログラミングの非常に一般的な規則に続く「コードに問題がない場合は、問題は他のどこかにあります」私は解決策
を見つけました溶液
is_active:
type: boolean
options:
default: true
nullable: true
.
今、単にtype: boolean
を使用してもTinyInt(4)を正しく認識しています