Можно ли указать тип столбца unsigned integer
в Doctrine 2?
Значение Doctrine 2 + unsigned
Ответ 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
Надеюсь, это поможет кому-то сэкономить время;)