从实体字段的列定义中获取ENUM值

时间:2018-12-21 10:15:21

标签: php symfony enums doctrine-orm

我有一列在实体类中定义为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'
]

提前谢谢!

1 个答案:

答案 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;