Php 如何自动转换mysql';使用Doctrine2选择时,是否将其设置为整数?

Php 如何自动转换mysql';使用Doctrine2选择时,是否将其设置为整数?,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,通常用于表示选项,通过这些选项,可以使用位运算将它们组合在一起 例如 第一个将返回以逗号分隔的选项列表(例如“option1,option2”) 第二个将返回3(1+2) 我使用的是Doctrine2,我只处理对象(不使用部分对象或数组)。所以我的问题是,在查询实体的存储库时,如何检索第二种格式 如果我将列映射为字符串,它将返回第一种格式。如果映射到整数,php将转换为0(intval('options,…')) 肮脏的黑客会将其添加到映射属性中: @ORM\Column(name=

通常用于表示选项,通过这些选项,可以使用位运算将它们组合在一起

例如

  • 第一个将返回以逗号分隔的选项列表(例如“option1,option2”)
  • 第二个将返回3(1+2)
我使用的是Doctrine2,我只处理对象(不使用部分对象或数组)。所以我的问题是,在查询实体的存储库时,如何检索第二种格式

如果我将列映射为字符串,它将返回第一种格式。如果映射到整数,php将转换为0(intval('options,…'))

肮脏的黑客会将其添加到映射属性中:

    @ORM\Column(name="set_column+0", type="integer")
。。。但是,它在插入或更新时会导致问题


有什么想法吗?

您需要为条令创建一个自定义类型,因为它不提供对
SET
type的内置支持。幸运的是,这很简单:

  • 定义类型类:

    use Doctrine\DBAL\Platforms\AbstractPlatform;
    use Doctrine\DBAL\Types\Type;
    
    class MyCustomSetType extends Type
    {
        const TYPE = 'my_custom_set';
    
        private $possibleValues = array('option1', 'opton2', ..., 'optionN');
    
        public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
        {
            return sprintf("SET('%s')", implode(',', $this->possibleValues));
        }
    
        public function convertToPHPValue($values, AbstractPlatform $platform)
        {
            return explode(',', $values);
        }
    
        public function convertToDatabaseValue($values, AbstractPlatform $platform)
        {
            if (!is_array($values)) {
                throw new \InvalidArgumentException('...');
            }
    
            foreach ($values as $value) {
                if (!in_array($value, $this->possibleValues, true)) {
                    throw new \InvalidArgumentException('...');
                }
            }
    
    
            return implode(',', $values);
        }
    
        public function getName()
        {
            return self::TYPE;
        }
    }
    
  • 注册新创建的类型:

    \Doctrine\DBAL\Types\Type::addType('my_custom_set', '\My\Type\MyCustomSet');
    
  • 为实体定义适当的映射:

    /**
     * @ORM\Column(type="my_custom_set")
     */
    protected $options = array();
    

  • 如果您想了解有关自定义类型的更多信息,请阅读文档:

    我知道自定义类型,但我不知道在执行选择操作时如何将设置值自动转换为整数值。您的示例有一个逗号分隔的列表,该列表被转换为数组。不过,这很有用,谢谢。我刚刚看到类型类有一个方法,可以完成这项工作
    公共函数convertopHPValueSQL($sqlExpr,$platform)
    /**
     * @ORM\Column(type="my_custom_set")
     */
    protected $options = array();