是否可以unsigned integer
在Doctrine 2中指定列类型?
是否可以unsigned integer
在Doctrine 2中指定列类型?
Answers:
您可以但是会失去便携性。使用columnDefinition
属性并将其设置为integer unsigned
。实际代码取决于您使用的内容。
columnDefinition:DDL SQL代码段,在列名之后开始,并指定完整的(不可移植!)列定义。此属性允许使用高级RMDBS功能。但是,您应谨慎使用此功能及其后果。如果使用“ columnDefinition”,SchemaTool将不再正确检测列上的更改。
教义参考:https : //www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#column
/ ** * @ORM \ Column(name =“ id”,type =“ integer”,options = {“ unsigned” = true}) * /
在文档中(我见过)没有任何地方可以谈论这一点,但是它可以工作。
更新资料
Yaml中的定义(主键从2.4开始)
id:
type: integer
options:
unsigned: true
options: { unsigned: true }
?
小数将允许这么大的数字,并允许您保留SchemaTool,只需将小数位设置为0。
<?php
/**
* @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
*/
Protected $facebookId;
在这里查看为什么的完整文章。[编辑](链接不起作用)我粘贴了以下文章。无论如何,这是我写的;)
如此之大的无符号数字会爆炸!w /教义2
ORM有一个固有的问题。如何仅采用某些RDBMS支持的数据类型,并允许您使用它。好吧,当谈到教义2和无符号数字时,他们有些懒惰。
我要做的就是存储我的64位Facebook 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。VARCHARS!?!?我即将心脏病发作。那是不可接受的。
因此输入十进制。这是完美的。存储大小是可变的,并且存储在二进制文件中,因此索引非常快。我们只是将小数精度设置为零和零。ORM可以将其移植到任何RDBMS,对于我们来说它足够大,不必关心不支持的已签名/未签名问题,并且闪电般快速。小数(20,0)应该可以很好地处理我们的facebook大小,即一百四十五亿四千六百四十亿七千四百四十亿七千三百四十亿七千五百一十五万一千一百六十五万一千五百一十五。
<?php
/**
* @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
*/
Protected $facebookId;
Doctrine 1文档和Doctrine 2文档说,您可以通过以下方式做到这一点:
PHP批注:
/**
* @Column(type="integer", name="some_field" options={"unsigned":true})
*/
protected $someField;
Yaml :(请参阅文档)
MyEntity:
fields:
someField:
type: integer
column: some_field
options:
unsigned: true
希望这可以帮助某人节省时间;)
我对原则2有相同的问题,并且可以用相同的方法解决,但是有一些优点:
/**
* @ORM\Column(name="id", type="integer", options={"unsigned"=true})
*/
运行diff迁移bin / console的doctrine:migration:diff会起到一定的作用,实际上,如果该列是其他表中的外键,则该学说可以找到它们并应用与所关注列相同的更新行。
您只需在迁移中删除外键,然后再在列类型转换后添加外键即可。