Можно ли указать тип столбца unsigned integer
в Doctrine 2?
Вы можете, но потеряете переносимость. Используйте атрибут columnDefinition
и установите для него значение integer unsigned
. Фактический код зависит от того, что вы используете.
columnDefinition: фрагмент DDL SQL, который начинается после имени столбца и определяет полное (не переносное!) определение столбца. Этот атрибут позволяет использовать расширенные функции RMDBS. Однако вы должны тщательно использовать эту функцию и последствия. SchemaTool больше не будет определять изменения в столбце, если вы используете «columnDefinition».
/ ** * @ORM \ Column (name = "id", type = "integer", options = {"unsigned" = true}) * /
В доке (который я видел) нет места, говорящего об этом, но он работает.
Обновить
Определение в Ямле (начиная с 2.4 для первичного ключа)
id: type: integer options: unsigned: true
Десятичные числа позволят использовать такие большие числа и позволяют сохранить SchemaTool, просто установите шкалу в 0.
<?php /** * @Column(type="decimal", precision=20, scale=0, nullable=false, unique=true) */ Protected $facebookId;
Оформите полную запись о том, почему здесь . [EDIT] (ссылка не работает) Я вставлял следующую статью. Это было написано мной в любом случае;)
беззнаковые числа, настолько большие, что ваш мозг взорвется! w / Доктрина 2
У ORM есть неотъемлемая проблема. Как вы берете тип данных только для поддержки некоторых RDBMS и позволяете использовать его в любом случае. Ну, когда дело доходит до Doctrine 2 и беззнаковых чисел, они немного ленивы.
Все, что я хочу сделать, это сохранить мои 64-битные идентификаторы facebook. Как это сложно? Ну, мои РСУБД – это 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. Мне не нравится думать, если мне это не нужно. Что я нашел? Все используют varchars. VARCHARS!?!? У меня был сердечный приступ. Это было просто неприемлемо.
Таким образом, вводится десятичная. Идеально. Размер хранилища является переменным, и он хранится в двоичном формате, поэтому индексирование происходит очень быстро. Мы просто устанавливаем десятичную точность в ноль и voilà. ORM может переносить это на любые СУБД, он достаточно велик для нас, чтобы не заботиться о неподдерживаемом подписанном / неподписанном выпуске, и он молниеносно. десятичный (20,0) должен отлично справляться с размером нашего восемнадцати пятидесяти четырех миллиардов четыреста четыреста триллиона семьсот сорок четыре триллиона семьдесят три миллиарда семьсот девяносто пятьсот пятьдесят одна тысяча шестьсот пятнадцать.
<?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;
Ямл: ( см. Документы )
MyEntity: fields: someField: type: integer column: some_field options: unsigned: true
Надеюсь, это поможет кому-то сэкономить время;)