具有自定义id生成器的Symfony2 Doctrine2自动增量字段

时间:2015-09-25 14:06:06

标签: php symfony doctrine-orm

我在使用Doctrine(2.5)和MySQL的Symfony(2.7)中遇到自定义id生成器,自动增量和学说迁移的问题。

当我使用自定义生成器时,id字段在migrations:diff输出中没有获得AUTO_INCREMENT状态。 当我在yaml中手动添加自动增量时,所有引用的表列也会获得AUTO_INCREMENT。

如何使用自定义生成器在主实体上使用自动增量而不影响引用?

实体(sites.orm.yml):

type: entity
table: sites
id:
  id:
    type: integer
    column: id
    generator:
      strategy: CUSTOM
    customIdGenerator:
      class: AssignableIdentityGenerator

发电机:

class AssignableIdentityGenerator extends AbstractIdGenerator {
  public function generate(EntityManager $em, $entity) {
    return $entity->getId() ? : (int) $em->getConnection()->lastInsertId();
  }

  public function isPostInsertGenerator() {
    return true;
  }
}

迁移:diff输出保持不变(删除AUTO_INCREMENT):

ALTER TABLE sites CHANGE id id INT NOT NULL;

如果我添加

options:
  autoincrement: true

我没有得到网站表的ALTER,这是正确的,因为它保留了AUTO_INCREMENT,但我得到了

ALTER TABLE other_table CHANGE site_id site_id INT AUTO_INCREMENT NOT NULL;

在引用表上,这是不正确的。

Doctrine原生地使用自己的IdentityGenerator支持AUTO_INCREMENT,我想我在Doctrine \ ORM \ Tools \ SchemaTool :: gatherColumn中找到了这个位置,但是它在私有方法中很深入:

if ($class->isIdGeneratorIdentity() && $class->getIdentifierFieldNames() == array($mapping['fieldName'])) {
    $options['autoincrement'] = true;
}

不幸的是,Doctrine对扩展不是很友好(许多私有方法/属性或类被实例化而不是使用可注入服务)。

有人能解决这个问题吗? 或者甚至可能有一个完全不同的想法,如何获得一个既可自动增量又可手动设置的id字段。

1 个答案:

答案 0 :(得分:3)

  

有人能解决这个问题吗?或者甚至可能有一个完全不同的想法,如何获得一个既可自动增量又可手动设置的id字段。

我为你找到了这个解决方案:

首先:您需要将ID策略设置为“自动”

/**
 * @var int
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
 protected $id;

第二:如果您想手动设置ID,则需要更改班级的元数据(在刷新之前)。在那里,您可以更改 IdGeneratorType

/**
 * @param EntityManager $em
 * @param mixed         $object
 */
protected function changeIdGeneratorType(EntityManager $em, $object)
{
     if ($object->getId() !== null) {
         $metadata = $em->getClassMetadata(get_class($object));
         $metadata->setIdGeneratorType($metadata::GENERATOR_TYPE_NONE);
     }
}
$metadata::GENERATOR_TYPE_NONE

使用此GeneratorType,您可以手动设置ID。

现在您将能够自动增量和手动设置ID