我正在尝试创建一个自定义列类型,但是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
。
class
属性/选项(特别是因为options
是针对平台的)。因此,从数据库读取的任何内容都无法与您拥有的内容相等。实际上,这完全取决于 symfony/doctrine 如何将注释转换为类型。我认为,您需要修改该过程,将您非常可变的类型注入到 doctrine 的类型系统中。我曾经和你处于同样的位置。幸运的是,只有一些“枚举”类型,将它们分成不同的 doctrine 类型就可以完美完成工作。 - Jakumi