如何检索Doctrine2 Entity的自定义columnDefinition?

时间:2014-05-21 12:04:20

标签: php orm doctrine-orm entitymanager silex

我使用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类的解决方案,但它不是我目前正在寻找的。感谢。

2 个答案:

答案 0 :(得分:1)

你应该能够像这样获取你想要的信息:

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

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

答案 1 :(得分:0)

您可以使用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);

您的实体类具有自定义类型&#34; enumjobstatus&#34;:

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

具有扩展getValues()方法的abstact枚举类型类:

<?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');