2011-11-07 13 views
7

Importación de datos en un nuevo proyecto Symfony2 utilizando Doctrine2 ORM.Cómo configurar manualmente una clave primaria en Doctrine2

Todos los registros nuevos deben tener una clave principal generada automáticamente. Sin embargo, para mi importación, me gustaría preservar las claves principales existentes.

estoy usando esto como mi configuración de Entidad:

type: entity 
    id: 
    id: 
     type: integer 
     generator: { strategy: AUTO } 

También he creado una incubadora para el campo ID en mi clase de entidad.

Sin embargo, cuando persisto y purgo esta entidad a la base de datos, no se conserva la clave que establecí manualmente.

¿Cuál es la mejor solución o solución para esto?

Respuesta

3

La siguiente respuesta no es mía sino de OP, que se publicó en la pregunta. Lo cambié a esta respuesta wiki de la comunidad.


que almacena una referencia al objeto de conexión y se utiliza para insertar manualmente que las filas y las relaciones de actualización. Esto evita por completo los generadores de identidad y persistencia. También es posible usar Connection para envolver todo este trabajo en una transacción.

Una vez que haya ejecutado las instrucciones de inserción, puede actualizar las relaciones.

Esta es una buena solución porque evita cualquier problema potencial que pueda experimentar al cambiar su configuración en un servidor activo.

En su función init:

// Get the Connection 
    $this->connection = $this->getContainer()->get('doctrine')->getEntityManager()->getConnection(); 

En el cuerpo principal:

// Loop over my array of old data adding records 
    $this->connection->beginTransaction(); 

    foreach(array_slice($records, 1) as $record) 
    { 
    $this->addRecord($records[0], $record); 
    } 

    try 
    { 
    $this->connection->commit(); 
    } 
    catch(Exception $e) 
    { 
    $output->writeln($e->getMessage()); 
    $this->connection->rollBack(); 

    exit(1); 
    } 

Crear esta función:

// Add a record to the database using Connection 
    protected function addRecord($columns, $oldRecord) 
    { 
    // Insert data into Record table 
    $record = array(); 
    foreach($columns as $key => $column) 
    { 
     $record[$column] = $oldRecord[$key]; 
    } 
    $record['id'] = $record['rkey']; 
    // Insert the data 
    $this->connection->insert('Record', $record); 
    } 
3

Probablemente ya haya considerado esto, pero mi enfoque sería establecer la estrategia del generador en 'ninguno' para la importación para que pueda importar manualmente las identificaciones existentes en su código de cliente. Luego, una vez que se completa la importación, cambie la estrategia del generador a 'auto' para permitir que el RDBMS tome el relevo desde allí. Un condicional puede determinar si el setter de id es invocado. Buena suerte, díganos qué termina decidiendo usar.

+0

Gracias por este consejo. He estado haciendo esto, pero no estoy seguro de si es ideal. Creo que puedo terminar ejecutando consultas DQL sin formato. –

+0

Vea arriba para mi solución. Usé el objeto Connection como una interfaz agradable para PDO. –

+0

Cómo deshabilitar (temporalmente) la estrategia del generador de ID: http://www.ens.ro/2012/07/03/symfony2-doctrine-force-entity-id-on-persist/ – aimfeld

Cuestiones relacionadas