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 那样工作的主要内容,如果未能解决你的问题,请参考以下文章

Oracle间接实现自增主键

如何在 ORM Doctrine2 中手动设置/保留主键

使用自定义 Doctrine 2 数据类型的依赖注入

mysql把主键定义为自动增长标识符类型

自定义主键的持久`toSqlKey`

ASP.NET Identity - 将用户 ID 主键默认类型从字符串更改为 int 以及使用自定义表名时出错