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