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)
@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();