我只使用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
答案 0 :(得分:0)
我在Doctrine问题跟踪器中打开了一份报告,以找出Doctrine为何如此工作的原因。答案很简单:
TinyInt的长度没有说明可以存储的值的大小。它在任何情况下都是1个字节,但如果你在你的领域使用这个选项,它会影响填充零。
Doctrine将自己的布尔类型映射到mysql tinyint类型,因为MySQL不提供自己的布尔类型。
有关更多信息,您可以在票证上阅读更多信息:
答案 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)