Что вы можете сделать, это создать пользовательский тип перечисления, как описано в документации 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;
Чтобы закончить, вы можете сделать следующий трюк, чтобы получить пользовательский класс enum, в котором определены ваши значения (я признаю, что это некрасиво, но я не нашел другого способа сделать это правильно):
$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;