13

ZF2でDoctrine 2 ORMを使用しています。

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

doctrine のサポート データ型でわかるように、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
4

4 に答える 4

19

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

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

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

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

于 2013-09-11T16:27:44.393 に答える
8

tinyintDoctrine 2 には型はありません。理由は簡単です。

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

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

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

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

于 2013-09-13T11:20:26.593 に答える
7

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

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

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

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

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

于 2013-09-12T07:36:34.877 に答える
1

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

于 2013-09-11T16:35:36.883 に答える