Значение Doctrine 2 + unsigned

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

Ответ 1

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

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

Ответ 2

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

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

Обновление

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

id:
  type: integer
  options:
    unsigned: true

Ответ 3

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

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

Оформить полную запись о том, почему здесь. [EDIT] (ссылка не работает) Я вставлял следующую статью. Это было написано мной в любом случае;)

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

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

Все, что я хочу сделать, это сохранить мои 64-битные идентификаторы facebook. Как это сложно? Ну, моя RDBMS - это mySQL, поэтому мне действительно нужен неподписанный bigint.

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

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

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

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

Таким образом, вводится десятичное число. Идеально. Размер хранилища является переменной и хранится в двоичном формате, поэтому индексирование происходит очень быстро. Мы просто устанавливаем десятичную точность в ноль и voilà. ORM может переносить это на любые РСУБД, что достаточно для того, чтобы мы не заботились о неподдерживаемой подписанной/неподписанной проблеме и ее молниеносной быстроте. десятичный (20,0) должен отлично справляться с размером нашего восемнадцати пятидесяти четырехсот сорока шести четыреллионных семисот сорока четырех триллионов семьдесят три миллиарда семьсот девять миллионов пятьсот пятьдесят одна тысяча шестьсот пятнадцать.

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

Ответ 4

Документация Doctrine 1 и Документация Doctrine 2 сказал, что вы можете сделать это следующими способами:

Аннотации PHP:

/**
 * @Column(type="integer", name="some_field" options={"unsigned":true})
 */
protected $someField;

Ямл: (см. документы)

MyEntity:
  fields:
    someField:
      type: integer
      column: some_field
      options:
        unsigned: true

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