Doctrine orm 在不刷新或setId()的情况下进行测试时,在Doctrine2实体中设置显式Id

Doctrine orm 在不刷新或setId()的情况下进行测试时,在Doctrine2实体中设置显式Id,doctrine-orm,Doctrine Orm,我将实体与 id: id: type: string length: 36 id: true generator: strategy: UUID 所以我没有setId()-方法。在测试时,这是我创建实体的方式: $person = new Person(); $person->setFirsname('Foo'); ... $manager->persit($person); // no

我将实体与

id:
    id:
        type: string
        length: 36
        id: true
        generator:
            strategy: UUID
所以我没有setId()-方法。在测试时,这是我创建实体的方式:

$person = new Person();
$person->setFirsname('Foo');
...
$manager->persit($person);
// no flush
我试过了

$metadata = $manager->getClassMetaData('Acme\Entities\Person');
$metadata->setIdGenerator(new AssignedGenerator());

$person = new Person();
....

但是它说它缺少一个指定的ID,但是如果没有setId(),我就无法设置它(我的实体中不需要setId()。

我对生成器进行了一些实验,并尝试了以下方法:

...
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Id\AbstractIdGenerator;

class AutoIncGenerator extends AbstractIdGenerator
{

    public $count = 0;

    public function generate(EntityManager $em, $entity)
    {
        $this->count++;
        return $this->count;
    }
}
这正是我所需要的。每个对象都有一个id(auto inc)和一个排他的数字范围


不需要flush()或setId()。

是。在你冲水之前它不会被设定。您可以使用反射直接设置它。甚至是Symfony PropertyAccess组件。但是你最好调整一下你的测试,这样他们就不需要id了。