【发布时间】:2020-05-14 21:16:38
【问题描述】:
我正在尝试创建自定义列类型,但 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。
【问题讨论】:
-
您是否有这么多可枚举的课程,以至于您无法为每个课程提供一种学说类型?那么类型将是不同/独特的,可以加入类。但我很痛苦,symfony(或学说 orm?)的集成在自定义类型上有点不足......
-
我有很多,因为我正在做的项目很大。问题是我不想每次向数据库添加字段时都定义一个新类型。很难快速跟踪,因为我正在处理的项目是一个模块化的 CMS,它拆分为多个捆绑包。枚举也只是一个例子,我还有一些其他可配置的数据库类型,例如。具有 2 个不同 SRID 值的点。
-
据我所知,
class属性/选项未存储在该列的数据库注释中(特别是因为options用于平台)。因此,从数据库中读取的内容永远不会等于您拥有的内容。本质上,这一切都归结为 symfony/doctrine 如何将注解转换为类型。我相信您将不得不修改该过程以将您非常可变的类型注入到教义的类型系统中。我曾经和你处于同样的位置。幸运的是,只有几个“枚举”类型,将它们分成不同的学说类型,效果非常好。 -
也许您可以创建自己的注释,然后生成教义类型,注册它们等等......