4
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;
    }
}

和代码

$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

为什么 Doctrine 会覆盖我的设置 ID?有没有办法可以防止这种情况?

PersistenceBuilder::prepareInsertData当检查是否设置了 id 时,会设置新的 Id 。我不知道为什么 id 字段被排除在更改集之外。

更新

我又读了一点代码,发现原因ifUnitOfWork::getDocumentActualData.

else if ( ! $class->isIdentifier($name) || $class->isIdGeneratorNone()) {
    $actualData[$name] = $value;
}

没有else所以没有为 id 设置值。
这是开发商深思熟虑的设计选择吗?

解决了

这是在我尚未更新到的最近提交中更新的。我不完全确定这是有意的。
https://github.com/doctrine/mongodb-odm/commit/fb2447c01cb8968255383ac5700f95b4327468a3#L2L503

4

1 回答 1

3

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

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

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

    //...
}

有关 Doctrine ODM 可用的不同自定义 ID 策略的更多信息,请参见此处 - http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/basic-mapping.html#basic-mapping-identifiers

于 2014-10-24T09:17:33.593 回答