¿Cómo puedo configurar mi propio MongoId con Doctrine ODM para MongoDB?
Frecuentes
Visto 1,793 veces
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;
}
}
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
1 Respuestas
3
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 mongodb doctrine mongodb-php doctrine-odm or haz tu propia pregunta.