我在使用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字段。
答案 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