Php 如何检索Doctrine2实体的自定义列定义?
我正在使用Doctrine2实体的columnDefinition语法为我的实体实现ENUM列Php 如何检索Doctrine2实体的自定义列定义?,php,orm,doctrine-orm,entitymanager,silex,Php,Orm,Doctrine Orm,Entitymanager,Silex,我正在使用Doctrine2实体的columnDefinition语法为我的实体实现ENUM列 /** * @Column(type="string", columnDefinition="ENUM('active','finished','cancelled')", * options={"comment" = "Job status"}) **/ protected $Status = 'active'; 现在我试图检索此列的定义,以获取可能的字段值列表。我查看了条令\ORM\Map
/**
* @Column(type="string", columnDefinition="ENUM('active','finished','cancelled')",
* options={"comment" = "Job status"})
**/
protected $Status = 'active';
现在我试图检索此列的定义,以获取可能的字段值列表。我查看了条令\ORM\Mapping\ClassMetadataInfo,但没有找到任何合适的方法来获取这些数据。谁能给我一些胶水吗
提前谢谢
UPD:问题正是关于“列定义”方法的。我确实知道使用自定义类型类的解决方案,但这不是我目前正在寻找的。谢谢。您可以使用中建议的解决方案2的方法,而不是尝试获取元数据。您可以为枚举创建一个类型。我使用
getValues()
方法扩展了抽象枚举类型,并创建了您的枚举类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);
作业状态枚举类型:
<?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);
}
您应该能够像这样获取所需的信息:
$metadata = $em->getClassMetadata('My\Entity');
$myPropertyMapping = $metadata->getFieldMapping('myProperty');
理论中的“场”是具有映射信息但不是“关联”的“实体”的属性。换句话说:如果您在docblock中定义了
@Column
注释,它就是一个“字段”。我已经看到了这个解决方案,它甚至可以工作,但现在我确实需要使用“columnDefinition”方法。谢谢你的回答,但这不是我想问的。你试过$em->getClassMetadata('My\Entity')->getFieldMapping('My_property')
?@JasperN.Brouwer Bingo!=)就是这样!我以前见过这个方法,但我非常确定它是用于映射字段的,而不是用于“普通”字段。你能回答一下你的意见吗?这样我就可以分配赏金了。谢谢!
<?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');
$metadata = $em->getClassMetadata('My\Entity');
$myPropertyMapping = $metadata->getFieldMapping('myProperty');