Zf2 doctrine2 как использовать tinyint тип данных в столбце объекта

Я использую Doctrine 2 ORM с ZF2.

/**
 * 
 * @ORM\Column(type="tinyint", options={"default" = 1})
 */
protected $isActive;

Как я могу создать столбец типа tinyint, как я могу видеть в формате данных поддержки доктрины, его не существует.

Commandline># ./vendor/bin/doctrine-module orm:validate-schema

[Mapping]  FAIL - The entity-class 'Application\Entity\User' mapping is invalid:
* The field 'Application\Entity\User#isActive' uses a non-existant type 'tinyint'.

  [Doctrine\DBAL\DBALException]
  Unknown column type "tinyint" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypeMap(). If this
  error occurs during database introspection then you might have forgot to register all database types for a Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseT
  ypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.


orm:validate-schema

Ответ 1

Используйте columnDefination, хотя это не идеальное решение, но оно служит цели.

/**
     * 
     * @ORM\Column(columnDefinition="TINYINT DEFAULT 1 NOT NULL")

     */
    protected $isActive;

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

Кроме того, вы должны помнить, что атрибут "type" по-прежнему обрабатывает преобразование значений PHP и базы данных. Если вы используете этот атрибут в столбце, который используется для соединений между таблицами, вы также должны взглянуть на @JoinColumn.

Ответ 2

Имо вам нужно просто использовать тип столбца. bool Doctrine затем преобразует это в tinyint в mysql для вас.

/**
 * @var bool
 * @ORM\Column(type="boolean")
 *
 * @Form\Exclude()
 */
protected $isActive;

Вы также можете определить значение по умолчанию:

...
protected $isActive = true;
...

Но вместо этого вы должны войти в свою заполненную область.

Ответ 3

В Доктрине 2 нет типа tinyint. Причина проста:

Тип Doctrine определяет преобразование между типами PHP и SQL, независимо от поставщика базы данных, который вы используете. Все типы сопоставления этот корабль с Доктриной полностью переносится между поддерживаемыми систем баз данных.

Вы должны выбрать один из них:

  • integer: Тип, который сопоставляет SQL INT с целым числом PHP.
  • smallint: Тип, который сопоставляет базу данных SMALLINT с целым числом PHP.
  • bigint: Тип, который сопоставляет базу данных BIGINT с строкой PHP.

Официальные документы здесь: http://docs.doctrine-project.org/en/latest/reference/basic-mapping.html#doctrine-mapping-types

Ответ 4

Здесь есть два подхода, я столкнулся со всей подобной проблемой, Doctrine позволяет вам создавать любые типы данных, которые, по вашему мнению, вам нужны или которые не могут быть доступны в своих пакетах. Второй подход - использовать Small Int, который может быть не оптимальным решением, но я думаю, что он обслуживает puropose. Я видел, что некоторые разработчики также используют тип Int, но все же это может быть не оптимальное решение.