我想基于 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;