将TINYINT添加到Doctrine SQL类型中



根据Symfony文档,我尝试添加TINYINT作为实体列类型。

到目前为止,它运行良好,但仍存在两个问题。。。

  1. 每次我想执行迁移时,Doctrine都无法重新配置关联列的TINYINT,并再次执行迁移查询。

  2. 在表单生成器中,默认情况下,TINYINT被重新配置为TextType,而不是NumberType

你知道我缺少什么来解决这两个问题吗?

TinyintType.php

use DoctrineDBALParameterType;
use DoctrineDBALPlatformsAbstractPlatform;
use DoctrineDBALTypesType;
class TinyintType extends Type {
const TINYINT='tinyint';
/**
* @return string
*/
public function getName() {
return self::TINYINT;
}
/**
* @param array $fieldDeclaration
* @param AbstractPlatform $platform
* @return string
*/
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
return $fieldDeclaration['unsigned'] === true ? 'TINYINT(1) UNSIGNED' : 'TINYINT(1)';
}
public function canRequireSQLConversion() {
return true;
}
/**
* @param $value
* @param AbstractPlatform $platform
* @return int|null
*/
public function convertToPHPValue($value, AbstractPlatform $platform) {
return $value === null ? null : (int)$value;
}
/**
* @param mixed $value
* @param AbstractPlatform $platform
* @return int|mixed|null
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform) {
return $value === null ? null : (int)$value;
}
/**
* @return int
*/
public function getBindingType() {
return ParameterType::INTEGER;
}
}

doctrine.yaml

doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
server_version: '5.7'
types:
tinyint: 'AppDoctrineDBALTypesTinyintType'
orm:
auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'AppEntity'
alias: App

第一期:来源https://blog.vandenbrand.org/2015/06/25/creating-a-custom-doctrine-dbal-type-the-right-way/

解决方案是在字段中添加注释以存储元数据这在文件中似乎不见了,但我找到了一些JIRA描述功能的问题。我们必须更改列定义这样类型的元数据就不会丢失

所以您的getSQLDeclaration应该是这样的:

public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'TINYINT'.(!empty($fieldDeclaration['unsigned']) ? ' UNSIGNED' : '').' COMMENT '(DC2Type:tinyint)'';
}

第二个问题:这是因为,默认情况下,symfony表单使用文本类型(symfony/form/FormBuilder.php::create(

if (null === $type && null === $this->getDataClass()) {
$type = 'SymfonyComponentFormExtensionCoreTypeTextType';
}

如果要设置其他类型,则应显式设置类型。

虽然接受的答案中的信息还可以,但我错过了复制&粘贴在这里,它就在这里。

类型声明:

<?php
namespace AppBundleDoctrine;
use DoctrineDBALPlatformsAbstractPlatform;
use DoctrineDBALTypesSmallIntType;
class TinyintType extends SmallIntType
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform)
{
return 'TINYINT' . (!empty($column['unsigned']) ? ' UNSIGNED' : '');
}

public function requiresSQLCommentHint(AbstractPlatform $platform)
{
return true;
}
public function getName()
{
return 'tinyint';
}
}

在初始化代码中键入注册:

DoctrineDBALTypesType::addType('tinyint', TinyintType::class);

最新更新