Doctrine 2中的类型映射DBAL

问题描述:

我只为我的项目使用了Doctrine的DBAL部分。所以我必须自己关心地图。我发现Doctrine将数据库类型重新映射为一个通用的PHP类型,您可以在这里阅读[1]。Doctrine 2中的类型映射DBAL

现在我发现Doctrine将DB类型TinyInt(4)映射为布尔值。根据MySQL手册,只有TinyInt(1)相当于布尔[2]。由于我的项目是一个我喜欢从mysqli转到Doctrine的遗留项目,因此我需要坚持原生的数据库类型。

我现在的问题是如何从原则中获得本机数据库类型?

在此先感谢您的帮助。

斯特凡诺

[1] http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html [2] http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html

+0

您是否可以从当前数据库获取映射并创建实体? (使用php doctrine orm:convert-mapping --from-database yml/path/to/mapping-path-converted-to-yml)http://docs.doctrine-project.org/en/latest/reference/tools。 html#reverse-engineering –

+0

我现在不使用ORM,只有Doctrine的DBAL组件。我发现Doctrine将每一个tinyint(不论其长度)映射为布尔值。到目前为止,我无法弄清楚为什么。 –

我运行结束了在原则问题跟踪报告,找出原因主义作品那样。答案很简单:

TinyInt的长度没有说明可以存储的值的大小。它在任何情况下都是1字节,但是如果你使用这个选项作为你的字段,它会影响填充零。

Doctrine将他自己的布尔类型映射到mysql tinyint类型,因为MySQL不提供自己的布尔类型。

欲了解更多信息,你可以阅读更多的门票:

http://www.doctrine-project.org/jira/browse/DBAL-781

+0

嗨,你有没有找到解决这个问题的方法?我太移植一些遗留数据库,并希望在不做任何修改的情况下使用它(现在) –

对于那些谁映射传统的MySQL数据库,以我发现学说常见问题解决方案,易于使用打交道时错过TINYINT(4)

TL; DR

变化default: '1'在字段映射到

is_active: 
    type: boolean 
    options: 
     default: true 
    nullable: true 

龙版

我在传统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(但即使这样做并没有解决问题,我仍然得到这个差异)

阳明映射有以下字段定义

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)

+0

是否假定您正在使用ORM,对吗?我没有想到如何仅使用Doctrine的DBAL组件来使用YAML配置文件。 –