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
类型的内置支持。幸运的是,这很简单:
-
定义类型类:
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; } }
-
注册新创建的类型:
DoctrineDBALTypesType::addType('my_custom_set', 'MyTypeMyCustomSet');
-
为实体定义适当的映射:
/** * @ORMColumn(type="my_custom_set") */ protected $options = array();
如果要查找有关自定义类型的更多信息,请阅读文档:自定义映射类型