Копирование записи базы данных с отношениями - PullRequest
2 голосов
/ 23 января 2011

У меня есть 2 набора таблиц в одной базе данных - живой набор и набор тестов. В каждом наборе есть две таблицы - таблица A и таблица B - между которыми существует отношение один ко многим.

Что мне нужно сделать, это выбрать определенные записи из таблицы A в наборе тестов и скопировать записи полностью, вместе с их связями в таблице B, в живой набор таблиц. Структура наборов идентична.

возможно ли это сделать без необходимости вручную разбивать записи?

Я использую доктрину ORM (думаю, 1.2) в контексте PHP-фреймворка Symfony 1.4.

Пока я пробовал что-то вроде этого:

$record = Doctrine_Core::getTable('testSetTableA')->find(1);
$liveSetTableArecord = new LiveSetTableArecord();
$liveSetTableArecord = $record->copy();
$liveSetTableArecord->save();

Но у меня такое ощущение, что мне не хватает чего-то фундаментального. Насколько я могу судить, нет способа установить запись целиком из объекта запроса?

1 Ответ

2 голосов
/ 25 января 2011

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

Гораздо эффективнее просто использовать необработанный оператор INSERT INTO, что я и делаю сейчас.

    $connection = Doctrine_Manager::connection();
    $query = "INSERT INTO Set2tableA SELECT * FROM Set1tableA WHERE id = '$id' ON DUPLICATE KEY UPDATE Set2tableA.id = Set2tableA.id";
    $statement = $connection->execute($query);
    $statement->execute();

    $query2 = "INSERT INTO Set2TableB SELECT * FROM Set1TableB WHERE tableA_id = '$id' ON DUPLICATE KEY UPDATE Set2TableB.id = Set1TableB.id";
    $statement = $connection->execute($query2);
    $statement->execute();

«ON DUPLICATE KEY UPDATE» необходимо, потому что основнойключ в таблице B не является нулевым, и поэтому при попытке скопировать запись 1 из таблицы A в таблицу B mysql обнаруживает, что запись с ID = 1 уже существует, и выдает ошибку.

...