web-dev-qa-db-ja.com

zf2doctrine2エンティティ列でtinyintデータ型を使用する方法

私はDoctrine 2 ORM withZF2を使用しています。

/**
 * 
 * @ORM\Column(type="tinyint", options={"default" = 1})
 */
protected $isActive;

教義のサポートデータ型 でわかるように、どのようにtinyintタイプの列を作成できますか?それは存在しません。

Commandline># ./vendor/bin/doctrine-module orm:validate-schema

[Mapping]  FAIL - The entity-class 'Application\Entity\User' mapping is invalid:
* The field 'Application\Entity\User#isActive' uses a non-existant type 'tinyint'.

  [Doctrine\DBAL\DBALException]
  Unknown column type "tinyint" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypeMap(). If this
  error occurs during database introspection then you might have forgot to register all database types for a Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseT
  ypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.


orm:validate-schema
12
Developer

columnDefinition を使用しますが、これは理想的なソリューションではありませんが、目的を果たします。

/**
 * 
 * @ORM\Column(columnDefinition="TINYINT DEFAULT 1 NOT NULL")
 */
protected $isActive;

columnDefinition:列名の後に始まり、完全な(移植性のない!)列定義を指定するDDLSQLスニペット。この属性を使用すると、高度なRMDBS機能を利用できます。ただし、この機能とその結果を注意深く使用する必要があります。 「columnDefinition」を使用すると、SchemaToolは列の変更を正しく検出しなくなります。

さらに、「type」属性は、PHPとデータベース値の間の変換を引き続き処理することを覚えておく必要があります。テーブル間の結合に使用される列のこの属性は、 @ JoinColumn も確認する必要があります。

16
Developer

Imoでは、列タイプbool Doctrineを使用するだけで、これがmysqlでtinyintに変換されます。

/**
 * @var bool
 * @ORM\Column(type="boolean")
 *
 * @Form\Exclude()
 */
protected $isActive;

次のようにデフォルト値を定義することもできます。

...
protected $isActive = true;
...

しかし、それを行うのではなく、あなたはあなたの人口に設定する必要があります。

7
cptnk

Doctrine 2.には、tinyint型はありません。理由は簡単です。

Doctrineタイプは、使用しているデータベースベンダーに関係なく、PHPとSQLタイプの間の変換を定義します。Doctrineは、サポートされているデータベースシステム間で完全に移植可能です。

次のいずれかを選択する必要があります。

  • integer:SQLINTをPHP整数)にマップする型。
  • smallint:データベースSMALLINTをPHP整数にマップするタイプ。
  • bigint:データベースBIGINTをPHP文字列にマップするタイプ。

ここの公式ドキュメント: http://docs.doctrine-project.org/en/latest/reference/basic-mapping.html#doctrine-mapping-types

6
edigu

ここには2つのアプローチがあり、最も類似した問題に直面しました。Doctrineを使用すると、必要と思われる、またはパッケージで使用できないデータ型を作成できます。2番目のアプローチはSmallを使用することです。 Intは最適なソリューションではないかもしれませんが、目的を果たしていると思います。一部の開発者もIntタイプを使用しているのを見てきましたが、それでも最適なソリューションではない可能性があります。

1
noobie-php