Получить значения ENUM из определения столбца поля сущности

У меня есть столбец, который определен как тип 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'
]

Заранее спасибо!!

0

Решение

Что вы можете сделать, это создать собственный тип 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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector