Doctrine2自定义类型不像主键Symfony2那样工作

时间:2013-05-29 12:33:36

标签: symfony orm doctrine-orm doctrine

我想根据UUID和二进制存储(16)制作主键。

为此,我为Doctrine创建了新类型 - “binary”

 class BinaryType extends Type
{
const BINARY = 'binary';

public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
    return sprintf('BINARY(%d)', $fieldDeclaration['length']);
}

public function getName()
{
    return self::BINARY;
}

public function convertToPhpValue($value, AbstractPlatform $platform)
{

    if ($value !== null) {
        $value= unpack('H*', $value);
        return array_shift($value);
    }
}

public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
    if ($value !== null) {
        return pack('H*', $value);
    }
}

}

同时注册此类型:

class MyBundle extends Bundle
{
  public function boot()
  {
     Type::addType('binary', '...\Doctrine2\BinaryType');
  }
}

问题:为什么此类型在简单字段中运行良好,但不使用主键(注释@ORM \ Id的字段),字段不会出现。

示例不处理注释。在这种情况下,不会出现db:

中的任何行
/**
 * @ORM\Id
 * @ORM\Column(type="binary", length=16, name="id", nullable=false)
 *
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $id;

 /**
 * 
 * @ORM\Column(name="second_id", type="integer", nullable=false)
 */
private $secondId;

工作注释的示例。我们在二进制类型中看到来自db和id的行:

/**
 * 
 * @ORM\Column(type="binary", length=16, name="id", nullable=false)
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $id;

 /**
 * @ORM\Id
 * @ORM\Column(name="second_id", type="integer", nullable=false)
 */
private $secondId;

1 个答案:

答案 0 :(得分:1)

我在这个问题上花了好几个小时,因为我也需要这样做。我最终得到了您的确切代码,只需稍作修改:省略@ ORM / GeneratedValue(strategy =“NONE”)。

换句话说,如果你改变了这个

/**
 * @ORM\Id
 * @ORM\Column(type="binary", length=16, name="id", nullable=false)
 *
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $id;

到此

/**
 * @ORM\Id
 * @ORM\Column(type="binary", length=16, name="id", nullable=false)
 */
private $id;

它对我有用。

如果你想要生成id,还有一件事你必须实现自己的生成器 像:

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Id\AbstractIdGenerator;

class GuidGenerator extends AbstractIdGenerator
{
    public function generate(EntityManager $em, $entity)
    {
        //return generated id
    }
}

并将注释更改为

/**
 * @ORM\Id
 * @ORM\Column(type="binary", length=16, name="id", nullable=false)
 * @ORM\GeneratedValue(strategy="CUSTOM") 
 * @ORM\CustomIdGenerator(class="path\to\IDGenerators\GuidGenerator") 
 */
private $id;

我意识到你可能会继续前进,但只是为下一个人发布这个。