Doctrine2 自定义类型不像主键 Symfony2 那样工作
Posted
技术标签:
【中文标题】Doctrine2 自定义类型不像主键 Symfony2 那样工作【英文标题】:Doctrine2 custom type not working like primary key Symfony2 【发布时间】:2013-05-29 12:33:35 【问题描述】:我想制作基于 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;
【问题讨论】:
【参考方案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;
我知道你可能会继续前进,但只是为下一个人发布这个。
【讨论】:
以上是关于Doctrine2 自定义类型不像主键 Symfony2 那样工作的主要内容,如果未能解决你的问题,请参考以下文章