Dotrine 2 DBAL 中的类型映射
-
20-12-2019 - |
题
我在我的项目中仅使用 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不提供自己的布尔类型。
对于更多信息,您可以在机票上阅读更多信息:
其他提示
对于那些将遗留 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)