我在我的项目中仅使用 Doctrine 的 DBAL 部分。所以我必须自己关心映射。我发现 Doctrine 将数据库类型重新映射为通用 PHP 类型,您可以在此处阅读 [1]。

现在我发现 Doctrine 将 DB 类型 TinyInt(4) 映射到 Boolean。根据 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

有帮助吗?

解决方案

我在教义问题跟踪器中致敬的报告,以弄清楚为什么原理的工作原理。答案很简单:

Tinyint的长度没有说出可以存储的值的大小。它在任何情况下都是1字节,但它会影响填充零,以防您使用此选项的字段。

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

对于更多信息,您可以在机票上阅读更多信息:

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

其他提示

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

长话短说

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

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

长版

我在旧数据库中有以下数据库结构,请注意 微小整数(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我最终得到了 diff

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)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top