У меня есть столбец, который определен как тип ENUM в классе сущности.
/**
* @ORM\Column(name="gender", type="string", columnDefinition="ENUM('Male', 'Female')")
*/
private $gender;
Я пытаюсь получить поля ENUM, предоставив имя поля getClassMetadata () лайк,
$em = $this->getDoctrine()->getManager();
$classMetadata = $em->getClassMetadata('App\Entity\User');
$fieldMapping = $classMetadata->getFieldMapping($field);
это $ fieldMapping имеет все необходимые данные, связанные с полем. Когда я пытаюсь получить доступ к ColumnDefinition этого поля $ FieldMapping [ ‘ColumnDefinition’], он возвращает только строка.
string 'ENUM('Male', 'Female')' (length=22)
Можно ли получить значения в массиве, как,
[
[0] => 'Male',
[1] => 'Female'
]
Заранее спасибо!!
Что вы можете сделать, это создать собственный тип enum, как описано в документации 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;
Других решений пока нет …