Получить значения ENUM из определения столбца поля сущности - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть столбец, который определен как тип ENUM в классе сущности.

/**
 * @ORM\Column(name="gender", type="string", columnDefinition="ENUM('Male', 'Female')")
 */
private $gender;

Я пытаюсь получить поля ENUM, предоставив имя поля для getClassMetadata () like,

$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'
]

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

1 Ответ

0 голосов
/ 21 декабря 2018

Что вы можете сделать, это создать пользовательский тип перечисления, как описано в документации 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;
...