Как вручную установить первичный ключ в Doctrine2 - PullRequest
7 голосов
/ 08 ноября 2011

Я импортирую данные в новый проект Symfony2 с помощью Doctrine2 ORM.

Все новые записи должны иметь автоматически сгенерированный первичный ключ.Тем не менее, для моего импорта я хотел бы сохранить существующие первичные ключи.

Я использую это в качестве своей конфигурации Entity:

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

Я также создал установщик для поля idв моем классе сущностей.

Однако, когда я сохраняю и сбрасываю эту сущность в базу данных, ключ, который я вручную установил, не сохраняется.

Какое обходное решение или решение для этого лучше?

Ответы [ 2 ]

3 голосов
/ 09 июля 2014

Следующий ответ не мой, а ОП, который был размещен в вопросе. Я переместил его в этот вики-ответ сообщества.


Я сохранил ссылку на объект Connection и использовал ее для ручной вставки строк и обновления отношений. Это позволяет избежать генерации персистентности и идентичности. Также возможно использовать Соединение, чтобы обернуть всю эту работу в транзакцию.

После выполнения операторов вставки вы можете обновить отношения.

Это хорошее решение, поскольку оно позволяет избежать любых потенциальных проблем, которые могут возникнуть при замене конфигурации на работающем сервере.

В вашей функции инициализации:

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

В вашем основном теле:

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

Создать эту функцию:

  // 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 голосов
/ 08 ноября 2011

Вы, вероятно, уже рассмотрели это, но мой подход заключается в том, чтобы установить стратегию генератора равной 'none' для импорта, чтобы вы могли вручную импортировать существующие идентификаторы в свой клиентский код. Затем, после завершения импорта, измените стратегию генератора обратно на «auto», чтобы позволить СУБД взять на себя управление. Условный может определить, вызывается ли установщик идентификатора. Удачи - дайте нам знать, что вы решите использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...