如何为MongoDB设置自己的MongoId和Doctrine ODM?

如何为MongoDB设置自己的MongoId和Doctrine ODM?,mongodb,doctrine,mongodb-php,doctrine-odm,Mongodb,Doctrine,Mongodb Php,Doctrine Odm,代码呢 use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; /** * @ODM\Document() */ class My_Doctrine_Model { /** @ODM\id */ protected $id; public function getId() { return $this->id; } public function setId($val

代码呢

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
 * @ODM\Document()
 */
class My_Doctrine_Model
{
    /** @ODM\id */
    protected $id;

    public function getId()
    {
        return $this->id;
    }

    public function setId($value)
    {
        $this->id = $value;
        return $this;
    }
}
为什么条令会覆盖我的集合id?有什么办法可以防止这种情况发生吗

当检查是否设置了Id时,会在
PersistenceBuilder::prepareInsertData
中设置新Id。我不知道为什么更改集中没有id字段

更新 我读了更多的代码,发现原因是
UnitOfWork::getDocumentActualData
中的最后一个
if

$myModel = new My_Doctrine_Model();
$myModel->setId(new MongoId());

// Id is my set id

$dm->persist($myModel);

// Id is my set id

$dm->flush();

// Id is overwritten and the object is inserted with an other one
没有
else
,因此没有为id设置值。
这是开发人员有意的设计选择吗

解决了的 这是在最近的一次提交中更新的,我还没有更新到。不过,我不能完全肯定这是有意的。

您可以使用Doctrine ODM注释使用自定义ID策略,例如-

else if ( ! $class->isIdentifier($name) || $class->isIdGeneratorNone()) {
    $actualData[$name] = $value;
}
有关条令ODM可用的不同自定义ID策略的更多信息,请参见:

/** Document */
class MyPersistentClass
{
    /** @Id(strategy="NONE") */
    private $id;

    public function setId($id)
    {
        $this->id = $id;
    }

    //...
}