Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检索Doctrine2实体的自定义列定义?_Php_Orm_Doctrine Orm_Entitymanager_Silex - Fatal编程技术网

Php 如何检索Doctrine2实体的自定义列定义?

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

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

/**
 * @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');