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 をオーバーライドするのはなぜですか? そして、これを防ぐ方法はありますか?

新しい ID はPersistenceBuilder::prepareInsertData、ID が設定されているかどうかを確認するチェックで設定されていないことが示されている場合に設定されます。id フィールドが変更セットから除外されている理由がわかりません。

アップデート

もう少しコードを読んだところ、その理由ifUnitOfWork::getDocumentActualData.

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

elseIDに値が設定されていないため、値はありません。
これは開発者による意図的な設計上の選択ですか?

解決済み

これは、私が更新していない最近のコミットで更新されました。ただし、これが意図されているかどうかは完全にはわかりません。
https://github.com/doctrine/mongodb-odm/commit/fb2447c01cb8968255383ac5700f95b4327468a3#L2L503

4

1 に答える 1