教义2 +无符号值


Answers:


19

您可以但是会失去便携性。使用columnDefinition属性并将其设置为integer unsigned。实际代码取决于您使用的内容。

columnDefinition:DDL SQL代码段,在列名之后开始,并指定完整的(不可移植!)列定义。此属性允许使用高级RMDBS功能。但是,您应谨慎使用此功能及其后果。如果使用“ columnDefinition”,SchemaTool将不再正确检测列上的更改。

教义参考:https : //www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#column


4
丢失可移植性在ORM中是不可接受的。设置为十进制精度为0。
哈蒙·伍德

132
/ **
 * @ORM \ Column(name =“ id”,type =“ integer”,options = {“ unsigned” = true})
 * /

在文档中(我见过)没有任何地方可以谈论这一点,但是它可以工作。

更新资料

Yaml中的定义(主键从2.4开始)

id:
  type: integer
  options:
    unsigned: true

5
使用SQLite将失败,因为它仅支持带符号的整数。
Harmon Wood

实际上在文档docs.doctrine-project.org/projects/doctrine1/en/latest/en/…中提到过,是的,它是特定于数据库的。
gondo

@gondo,这是原则1
格伦- 84

1
@hardik我们可以在gondo链接学说在github上看到“repositoryClass:学说\测试\型号\ DDC869 \ DDC869PaymentRepository ID:ID:类型:无符号整型:真正的”
Mikl

2
@hardik喜欢:options: { unsigned: true }
MauganRa 2014年

14

小数将允许这么大的数字,并允许您保留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;

完整的写入链接已损坏。如果没有答案,答案是行不通的。您能否详细说明或修复该链接?
PutzKipa 2012年

@PutzKipa我将我写的另一篇文章粘贴到了此答案的底部。
哈蒙·伍德2013年

1
@BradyEmerson为什么会翻转?精度告诉我们很多小数点。在这种情况下,我们要劫持要用作整数的浮点数,因此Precision为0。scale是我们必须适合大数的内存分配大小,因此20是适合我们Facebook需求的最佳数字,可悲的是19设为小而0(根据您的要求)甚至不会保存数字。
哈蒙·伍德

1
至少对于MySQL而言,精度是最大位数。scale是小数点右边的位数。dev.mysql.com/doc/refman/5.1/en/...
布雷迪艾默生

1
BTW:Facebook的ID是根据字符串developers.facebook.com/docs/graph-api/reference/v2.1/user但不管小数是好的其他他们可以存储的数据。
LeventePánczél2014年

12

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

希望这可以帮助某人节省时间;)


1

我对原则2有相同的问题,并且可以用相同的方法解决,但是有一些优点:

/**
 * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
 */

运行diff迁移bin / console的doctrine:migration:diff会起到一定的作用,实际上,如果该列是其他表中的外键,则该学说可以找到它们并应用与所关注列相同的更新行。

您只需在迁移中删除外键,然后再在列类型转换后添加外键即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.