gpt4 book ai didi

mongodb - 如何使用 Doctrine ODM for MongoDB 设置我自己的 MongoId?

转载 作者:可可西里 更新时间:2023-11-01 09:46:20 24 4
gpt4 key购买 nike

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 会覆盖我的 set id?有什么办法可以防止这种情况发生吗?

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

更新

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

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

没有 else 所以没有为 id 设置值。
这是开发人员故意的设计选择吗?

已解决

这是在最近的一次提交中更新的,我还没有更新。不过,我不完全确定这是有意为之。
https://github.com/doctrine/mongodb-odm/commit/fb2447c01cb8968255383ac5700f95b4327468a3#L2L503

最佳答案

您可以使用 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

关于mongodb - 如何使用 Doctrine ODM for MongoDB 设置我自己的 MongoId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10427421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com