在Doctrine 2 DBAL中键入映射

时间:2014-01-08 18:40:42

标签: php mysql database doctrine-orm dbal

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

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

我现在的问题是如何从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

2 个答案:

答案 0 :(得分:0)

我在Doctrine问题跟踪器中打开了一份报告,以找出Doctrine为何如此工作的原因。答案很简单:

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

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

有关更多信息,您可以在票证上阅读更多信息:

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

答案 1 :(得分:-1)

对于那些将遗留的mysql数据库映射到该学说的人,我找到了解决常见问题的解决方案,这在处理TINYINT时很容易被忽略(4)

<强> TL; DR

将字段映射中的default: '1'更改为

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

长版

我在旧数据库中有以下数据库结构,请注意is_active列中的 tinyint(4)

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;

我无法对现有数据库进行任何修改(但即使这样做也没有解决问题,我仍然得到这种差异)

yml映射具有以下字段定义

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)