【问题标题】:How to retrieve custom columnDefinition of Doctrine2 Entity?如何检索 Doctrine2 实体的自定义列定义?
【发布时间】:2014-07-10 01:32:23
【问题描述】:

我正在使用 Doctrine2 实体的 columnDefinition 语法为我的实体实现 ENUM 列。

/**
 * @Column(type="string", columnDefinition="ENUM('active','finished','cancelled')",
 * options={"comment" = "Job status"})
 **/
protected $Status = 'active';

现在我正在尝试检索此列的定义以获取可能的字段值列表。我查看了 Doctrine\ORM\Mapping\ClassMetadataInfo,但没有找到任何合适的方法来获取这些数据。谁能给我一些胶水?

提前致谢!

UPD: 问题正是关于“columnDefinition”方法的。我确实知道使用自定义学说 ENUMType 类的解决方案,但这不是我目前正在寻找的。谢谢。

【问题讨论】:

  • 你试过$em->getClassMetadata('My\Entity')->getFieldMapping('my_property')吗?
  • @JasperN.Brouwer 宾果游戏! =) 就是这样!我之前看到过这种方法,但很确定它适用于映射字段,而不是“普通”字段。您能否回答您的评论,以便我分配赏金。非常感谢!

标签: php orm doctrine-orm entitymanager silex


【解决方案1】:

你应该可以像这样获取你想要的信息:

$metadata = $em->getClassMetadata('My\Entity');
$myPropertyMapping = $metadata->getFieldMapping('myProperty');

Doctrine 中的“字段”是具有映射信息的“实体”的属性,但不是“关联”。换句话说:如果您在文档块中定义了 @Column 注释,它就是一个“字段”。

【讨论】:

    【解决方案2】:

    您可以使用documentation 中建议的解决方案2 中的方法,而不是尝试获取元数据。您可以为您的枚举创建一个类型。我使用getValues() 方法扩展了抽象EnumType 并创建了您的枚举类EnumJobStatusType(请注意,name 属性是您的实体的相关类型)。

    通过这种方式,您只需调用以下命令即可获取您的值,并通过为您的值使用常量,您可以轻松且省钱地设置您的状态:

    <?php
    // fetching the possible values
    $enum = new \MyProject\DBAL\EnumJobStatusType();
    $values = $enum->getValues();
    
    //setting the active status
    $job->setStatus(\MyProject\DBAL\EnumJobStatusType::ACTIVE);
    

    您的具有自定义类型“enumjobstatus”的实体类:

    <?php
    /** @Entity */
    class Job
    {
        /**
        * @Column(type="enumjobstatus")
        **/
        private $status;
    }
    

    带有扩展getValues()方法的抽象枚举类型类:

    <?php
    namespace MyProject\DBAL;
    
    use Doctrine\DBAL\Types\Type;
    use Doctrine\DBAL\Platforms\AbstractPlatform;
    
    abstract class EnumType extends Type
    {
        protected $name;
        protected $values = array();
    
        public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
        {
            $values = array_map(function($val) { return "'".$val."'"; }, $this->values);
    
            return "ENUM(".implode(", ", $values).") COMMENT '(DC2Type:".$this->name.")'";
        }
    
        public function convertToPHPValue($value, AbstractPlatform $platform)
        {
            return $value;
        }
    
        public function convertToDatabaseValue($value, AbstractPlatform $platform)
        {
            if (!in_array($value, $this->values)) {
                throw new \InvalidArgumentException("Invalid '".$this->name."' value.");
            }
            return $value;
        }
    
        public function getName()
        {
            return $this->name;
        }
    
        public function getValues() {
            return $this->values;
        }
    }
    

    作业状态枚举类型:

    <?php
    namespace MyProject\DBAL;
    
    class EnumJobStatusType extends EnumType
    {
        const ACTIVE = 'active';
        const FINISHED = 'finished';
        const CANCELLED = 'cancelled';
    
        protected $name = 'enumjobstatus';
        protected $values = array(self::ACTIVE, self::FINISHED, self::CANCELLED);
    }
    

    请注意,您需要向

    注册您的类型
    Type::addType('enumjobstatus', 'MyProject\DBAL\EnumJobStatusType');
    

    【讨论】:

    • 我已经看到了这个解决方案,它甚至可以工作,但现在我确实需要使用“columnDefinition”方法。感谢您的回答,但这不是我要问的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2020-12-13
    • 2020-12-20
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多