13

我正在使用带有 ZF2 的 Doctrine 2 ORM。

/**
 * 
 * @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
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

教义 2中没有tinyint类型。原因很简单:

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

这里有两种方法,我遇到了所有最相似的问题,Doctrine 允许您创建您认为需要或在其包中不可用的任何数据类型。第二种方法是使用 Small Int 可能不是最佳解决方案,但我认为它符合目的。我已经看到一些开发人员也使用 Int 类型,但它仍然可能不是最佳解决方案。

于 2013-09-11T16:35:36.883 回答