如何向Doctrine列类型添加自定义参数

10

我正在尝试创建一个自定义列类型,但是SQL需要依赖于一个自定义参数。默认类型可以轻松处理这些参数,例如字符串类型具有长度。我该如何为我的类型添加一个参数。

以下是我试图实现的示例:

class EnumType extends Type
{
    const ENUM = 'enum';

    public function getName(): string
    {
        return self::ENUM;
    }

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
    {
        $class = $fieldDeclaration['class'];

        if (!is_subclass_of($class, Enum::class)) {
            throw new \Exception('You must specify a valid enum class');
        }

        $values = call_user_func([$class, 'getValues']);

        return "ENUM('" . implode("', '", $values) . "')";
    }

    public function convertToPHPValue($value, AbstractPlatform $platform): ?Point
    {
        return $value;
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
    {
        return $value;
    }

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

到目前为止,我尝试过以下方法:

    /**
     * @var string
     * @ORM\Column(type="enum", class="App\Enums\OrderStatus")
     */
    protected $status;

    /**
     * @var string
     * @ORM\Column(type="enum", options={"class":"App\Enums\OrderStatus"})
     */
    protected $status;

第一个没有起作用,显示错误,类字段未定义。 第二个可以正常运行,但是它总是试图重新制作列,因为在从数据库加载定义时没有检测到class


你是否有太多可枚举的类,以至于无法为每个类都提供一个Doctrine类型?那么这些类型将是不同/独特的,而类可以被嵌入。但我理解你的痛苦,Symfony(或Doctrine ORM?)在自定义类型方面的集成有点不足... - Jakumi
1
我有很多问题,因为我正在处理的项目非常大。 问题在于,每次向数据库添加一个字段时,我都不想定义一个新类型。由于我正在处理的项目是分布在多个包中的模块化 CMS,这将很快难以跟踪。此外,枚举只是一个例子,我还有其他可配置的数据库类型,例如具有2个不同 SRID 值的 Point。 - HubertNNN
1
据我所知,数据库列的注释中没有存储 class 属性/选项(特别是因为 options 是针对平台的)。因此,从数据库读取的任何内容都无法与您拥有的内容相等。实际上,这完全取决于 symfony/doctrine 如何将注释转换为类型。我认为,您需要修改该过程,将您非常可变的类型注入到 doctrine 的类型系统中。我曾经和你处于同样的位置。幸运的是,只有一些“枚举”类型,将它们分成不同的 doctrine 类型就可以完美完成工作。 - Jakumi
也许你可以创建自己的注解,然后生成Doctrine类型,注册它们等等... - Jakumi
1个回答

0

您是否忘记在config/packages/doctrine.yaml中配置类型?

它应该如下所示:

doctrine:
   dbal:
      types:
         enum: 'App\Doctrine\Types\EnumType' #Change it to valid class

在连接部分添加一个mapping_types:

doctrine:
   dbal:
      connections:
         default:
            mapping_types:
               enum: enum

我已经注册了我的类型,是的。 - HubertNNN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接