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

时间:2020-01-29 11:22:51

标签: mysql symfony doctrine

我正在尝试创建自定义列类型,但是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,因此它总是尝试重新制作该列。

1 个答案:

答案 0 :(得分: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