我有一列在实体类中定义为ENUM类型。
/**
* @ORM\Column(name="gender", type="string", columnDefinition="ENUM('Male', 'Female')")
*/
private $gender;
我正在尝试通过向 getClassMetadata()提供字段名称来获取ENUM字段,
$em = $this->getDoctrine()->getManager();
$classMetadata = $em->getClassMetadata('App\Entity\User');
$fieldMapping = $classMetadata->getFieldMapping($field);
此 $ fieldMapping 具有所有必要的字段相关数据。当我尝试通过 $ fieldMapping ['columnDefinition'] 访问该字段的 columnDefinition 时,它仅返回字符串。
string 'ENUM('Male', 'Female')' (length=22)
是否可以像这样获得数组中的值
[
[0] => 'Male',
[1] => 'Female'
]
提前谢谢!
答案 0 :(得分:0)
您可以按照Doctrine文档Mysql Enums中所述创建自定义枚举类型:
<?php
namespace AppBundle\DBAL;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
class EnumGender extends Type
{
const MALE = 'male';
const FEMALE = 'female';
const NAME = 'enum_gender';
const VALUES = array(self::MALE, self::FEMALE);
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
$values = array_map(function ($val) {
return "'" . $val . "'";
}, self::VALUES);
return 'ENUM(' . implode(', ', $values) . ')';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!\in_array($value, self::VALUES)) {
throw new \InvalidArgumentException("Invalid '" . self::NAME . "' value.");
}
return $value;
}
public function getName()
{
return self::NAME;
}
public function requiresSQLCommentHint(AbstractPlatform $platform)
{
return true;
}
}
在您的实体中,您可以将属性注释更改为:
/**
* @ORM\Column(name="gender", type="string", type="enum_gender")
*/
private $gender;
最后,您可以执行以下技巧,以获取在定义您的值的位置的自定义枚举类(我承认这很丑陋,但我还没有找到其他方法来正确执行此操作):
$em = $this->getDoctrine()->getManager();
$classMetadata = $em->getClassMetadata(User::class);
$fieldMapping = $classMetadata->getTypeOfField('gender');
$className = implode('', explode('_', ucwords($fieldType, '_')));
$namespace = 'AppBundle\DBAL\\' . $className;
$values = $namespace::VALUES;