¿Cómo puedo configurar mi propio MongoId con Doctrine ODM para MongoDB?

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

Y el codigo

$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

¿Por qué Doctrine anula mi ID de conjunto? ¿Y hay alguna manera de prevenir esto?

La nueva identificación se establece en PersistenceBuilder::prepareInsertData cuando la verificación para ver si se ha establecido una identificación dice que no lo está. No sé por qué el campo de identificación se deja fuera del conjunto de cambios.

Noticias

Leí un poco más de código y descubrí que la razón es la última if in UnitOfWork::getDocumentActualData.

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

No hay else por lo que no se establece ningún valor para la identificación.
¿Es esta una elección de diseño deliberada por parte de los desarrolladores?

resuelto

Esto se actualizó en una confirmación reciente a la que no he actualizado. Sin embargo, no estoy completamente seguro de que esto sea intencionado.
https://github.com/doctrine/mongodb-odm/commit/fb2447c01cb8968255383ac5700f95b4327468a3#L2L503

preguntado el 03 de mayo de 12 a las 09:05

1 Respuestas

Podría usar una estrategia de identificación personalizada usando las anotaciones de Doctrine ODM, por ejemplo:

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

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

    //...
}

Puede encontrar más información sobre las diferentes estrategias de ID personalizadas disponibles para Doctrine ODM aquí: http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/basic-mapping.html#basic-mapping-identifiers

Respondido 24 Oct 14, 10:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.