我正在使用带有ZF2的Doctrine 2 ORM。
/**
*
* @ORM\Column(type="tinyint", options={"default" = 1})
*/
protected $isActive;
如何在support data type of 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
答案 0 :(得分:16)
使用columnDefinition,虽然它不是理想的解决方案,但能达到目的。
/**
*
* @ORM\Column(columnDefinition="TINYINT DEFAULT 1 NOT NULL")
*/
protected $isActive;
columnDefinition:在列名后面开始并指定完整(非可移植!)列定义的DDL SQL片段。此属性允许使用高级RMDBS功能。但是,您应该仔细使用此功能及其后果。如果使用“ columnDefinition ”,SchemaTool将不再正确检测列的更改。
此外,您应该记住“类型”属性仍然处理PHP和数据库值之间的转换。如果在用于表之间连接的列上使用此属性,则还应该查看@JoinColumn。
答案 1 :(得分:7)
/**
* @var bool
* @ORM\Column(type="boolean")
*
* @Form\Exclude()
*/
protected $isActive;
你也可以定义一个默认值:
...
protected $isActive = true;
...
而是这样做,你应该在你的填充中设置。
答案 2 :(得分:6)
Doctrine 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
答案 3 :(得分:1)
这里有两种方法,我遇到了所有类似的问题,Doctrine允许您创建任何您认为需要或在其包中不可用的数据类型。第二种方法是使用Small Int,这可能不是最佳解决方案,但我认为它服务于puropose。我见过一些开发人员也使用Int类型,但它仍然不是最佳解决方案。