2

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

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

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

4

2 回答 2

0

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

TinyInt 的长度并没有说明可以存储的值的大小。在任何情况下它都是 1 字节,但如果您将此选项用于您的字段,它会影响填充零。

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

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

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

于 2014-01-11T13:32:16.930 回答
-1

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

TL;博士

default: '1'字段映射更改为

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

长版

我在遗留数据库中有以下数据库结构,请注意列中的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 我最终得到了 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)

于 2014-02-27T10:37:20.900 回答