我想根据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;
答案 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;
我意识到你可能会继续前进,但只是为下一个人发布这个。