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, но все же это может быть не оптимальное решение.