2

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

为此,我为 Doctrine 创建了新类型 - “二进制”

 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;
4

1 回答 1

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;

我意识到您可能会继续前进,但只是将其发布给下一个人。

于 2014-03-19T18:22:54.980 回答