Доктрина 2 + значение без знака - PullRequest
63 голосов
/ 08 октября 2011

Можно ли указать тип столбца unsigned integer в Doctrine 2?

Ответы [ 4 ]

118 голосов
/ 08 января 2013
/**
 * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
 */

В документе (который я видел) нет места, где бы это говорилось, но это работает.

Обновление

Определение вYaml (по состоянию на 2.4 для первичного ключа)

id:
  type: integer
  options:
    unsigned: true
18 голосов
/ 08 октября 2011

Вы можете, но вы потеряете переносимость.Используйте атрибут columnDefinition и установите его на integer unsigned.Фактический код зависит от того, что вы используете.

columnDefinition: фрагмент кода DDL SQL, который начинается после имени столбца и задает полное (непереносимое!) Определение столбца.Этот атрибут позволяет использовать расширенные функции RMDBS.Однако вы должны тщательно использовать эту функцию и последствия.SchemaTool больше не будет правильно определять изменения в столбце, если вы используете «columnDefinition».

13 голосов
/ 26 апреля 2012

Десятичные дроби позволят использовать такие большие числа и позволят вам сохранить SchemaTool, просто установите масштаб на 0.

<?php
/**
 * @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
 */
Protected $facebookId;

Оформление полной записи о том, почему здесь .[РЕДАКТИРОВАТЬ] (ссылка не работает) Я вставил статью ниже.В любом случае это было написано мной;)

число без знака, настолько большое, что ваш мозг взорвется!w / Doctrine 2

ORM имеют внутреннюю проблему.Как вы берете тип данных только некоторые RDBMS поддержки и позволяют вам использовать его в любом случае.Ну, когда дело доходит до Doctrine 2 и чисел без знака, они становятся немного ленивыми.

Все, что я хочу сделать, это сохранить мои 64-битные идентификаторы facebook.Насколько это сложно?Ну, моя СУБД - это MySQL, так что все, что мне действительно нужно, - это беззнаковый bigint.

<?php
/**
 * @Column(type="bigint", nullable=false, unique=true, columnDefinition="unsigned")
 */
Protected $facebookId;

Кажется, что вы найдете это, пока вы не прочитаете:

columnDefinition: Фрагмент DDL SQL, который начинается после столбцаname и указывает полное (непереносимое!) определение столбца.Этот атрибут позволяет использовать расширенные функции RMDBS.Однако вы должны тщательно использовать эту функцию и последствия.SchemaTool больше не будет правильно определять изменения в столбце, если вы используете «columnDefinition».По сути, эта функция позволяет вам свободно формировать неподдерживаемые элементы в определении столбца.Изготовление чисел без знака технически НЕ ПОДДЕРЖИВАЕТСЯ!Не говоря уже о том, что мои системы разработки и QA сильно зависят от SchemaTool.Мы можем поблагодарить ленивых разработчиков из Doctrine и sqlite3 за этот маленький кусочек сумасшедшего города.

Это сразу же вызвало поиск в Google.Я не люблю думать, если мне не нужно.Что я нашел?Все используют Varchars.VARCHARS!?!?У меня был сердечный приступ.Это было просто недопустимо.

Таким образом, вводится десятичное число.Это идеально.Размер хранилища является переменным, и он хранится в двоичном формате, поэтому индексирование выполняется очень быстро.Мы просто устанавливаем десятичную точность на ноль и вуаля.ORM может портировать это на любую RDBMS, она достаточно большая, чтобы мы не заботились о неподдерживаемой проблеме со знаком / без знака, и это молниеносно.десятичная дробь (20,0) должна обрабатывать нашу страницу в facebook размером восемнадцать квинтиллионов четыреста сорок шесть квадриллионов семьсот сорок четыре триллиона семьдесят три миллиарда семьсот девять миллионов пятьсот пятьдесят одна тысяча шестьсот пятнадцать довольно хорошо.

<?php
/**
 * @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true)
 */
Protected $facebookId;
8 голосов
/ 16 февраля 2017

Документация 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

Надеюсь, это поможет кому-то сэкономить время;)

...