是否可以在Doctrine 2中指定unsigned integer
的列类型?
答案 0 :(得分:118)
/** * @ORM\Column(name="id", type="integer", options={"unsigned"=true}) */
文档(我见过)中没有任何地方可以说明这一点,但它确实有效。
<强>更新强>
Yaml中的定义(主键为2.4)
id:
type: integer
options:
unsigned: true
答案 1 :(得分:18)
你可以,但你会失去便携性。使用columnDefinition
属性并将其设置为integer unsigned
。实际代码取决于您使用的是什么。
columnDefinition:在列名后面开始的DDL SQL代码段 并指定完整(非可移植!)列定义。这个 属性允许使用高级RMDBS功能。不管你 应该仔细使用这个功能和后果。 如果,SchemaTool将不再正确检测列的更改 你使用“columnDefinition”。
答案 2 :(得分:13)
小数将允许这么大的数字,并允许你保留SchemaTool,只需将比例设置为0.。
<?php
/**
* @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
*/
Protected $facebookId;
查看有关here原因的完整说明。 [编辑](链接不起作用)我已粘贴下面的文章。它总是由我写的;)
无符号数字这么大你的大脑会爆炸! w / Doctrine 2
ORM有一个固有的问题。你如何只采用一些数据类型的RDBMS支持并允许你使用它。当谈到Doctrine 2和无符号数字时,他们有点懒惰。
我想要做的就是存储我的64位脸书ID。这有多难?我的RDBMS是mySQL所以我真正需要的是一个无符号的bigint。
<?php
/**
* @Column(type="bigint", nullable=false, unique=true, columnDefinition="unsigned")
*/
Protected $facebookId;
这看起来很花哨,直到你读到这个:
columnDefinition:在列名后面开始并指定完整(非可移植!)列定义的DDL SQL片段。此属性允许使用高级RMDBS功能。但是,您应该仔细使用此功能及其后果。如果使用“columnDefinition”,SchemaTool将不再正确检测列的更改。 基本上,此功能允许您将不受支持的内容释放到列定义中。在技术上使未签名的号码得到联合支持!更不用说我的开发和QA部署系统严重依赖SchemaTool。我们可以感谢Doctrine和sqlite3的懒惰开发人员为这个疯狂城镇的小块工作。
这立即促成了谷歌搜索。如果我不需要,我不想。我找到了什么?每个人都在使用varchars。 VARCHAR处理!?!?我有心脏病发作。这是不可接受的。
因此输入小数。这是完美的。存储大小是可变的,它以二进制形式存储,因此索引速度非常快。我们只需将小数精度设置为零即可。 ORM可以将其移植到任何RDBMS,它足够大,我们不关心不受支持的签名/未签名问题,而且速度很快。十进制(20,0)应该处理我们的facebook大小十八分之四十四亿四千四百四十四万亿七十三亿七千九百五十五百五十一数千六百一十五相当不错。
<?php
/**
* @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
*/
Protected $facebookId;
答案 3 :(得分:7)
Doctrine 1 documentation和Doctrine 2 documentation表示你可以通过以下方式实现:
PHP注释:
/**
* @Column(type="integer", name="some_field" options={"unsigned":true})
*/
protected $someField;
Yaml:(see docs)
MyEntity:
fields:
someField:
type: integer
column: some_field
options:
unsigned: true
希望这有助于节省时间;)
答案 4 :(得分:1)
我对准则2有相同的问题,并且我用相同的方式解决它,但是有一些优点:
/**
* @ORM\Column(name="id", type="integer", options={"unsigned"=true})
*/
运行diff迁移bin / console doctrine:migration:diff 会起到一些神奇作用。实际上,如果该列是其他表中的外键,则该学说能够找到并应用它们与相关列位于同一更新行。
您只需要在迁移时先删除外键,然后在列类型转换后添加外键即可。