使用 Doctrine2 进行选择时,如何自动将 mysql 的 SET 转换为其整数?



mysql 的 SET 数据类型通常用于表示选项,从而可以使用按位运算组合它们。

例如。

    SELECT set_column, set_column + 0 FROM table
  • 第一个将返回一个逗号分隔的选项列表(例如。"选项 1、选项 2")
  • 第二个将返回 3 (1+2)

我正在使用 Doctrine2,我只处理对象(不使用部分对象或数组)。所以我的问题是,在查询实体的存储库时,如何检索第二种格式?

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

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

    @ORMColumn(name="set_column+0", type="integer")

。但是,在插入或更新时会导致问题。

有什么想法吗?

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

  1. 定义类型类:

    use DoctrineDBALPlatformsAbstractPlatform;
    use DoctrineDBALTypesType;
    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;
        }
    }
    
  2. 注册新创建的类型:

    DoctrineDBALTypesType::addType('my_custom_set', 'MyTypeMyCustomSet');
    
  3. 为实体定义适当的映射:

    /**
     * @ORMColumn(type="my_custom_set")
     */
    protected $options = array();
    

如果要查找有关自定义类型的更多信息,请阅读文档:自定义映射类型

相关内容

  • 没有找到相关文章