我在同一个数据库中有两组表 - 一个实时集和一个测试集。每个集合中都有两个表 - 表A和表B - 它们之间具有一对多的关系。
我需要做的是从测试集中的表A中选择某些记录,并将整个记录及其在表B中的关系复制到实时表集中。集合的结构是相同的。
是否可以在不必手动打破记录的情况下执行此操作?
我在symfony 1.4 PHP框架的上下文中使用了学说ORM(1.2我认为)。
到目前为止,我一直在尝试这样的事情:
$record = Doctrine_Core::getTable('testSetTableA')->find(1);
$liveSetTableArecord = new LiveSetTableArecord();
$liveSetTableArecord = $record->copy();
$liveSetTableArecord->save();
但我觉得我错过了一些基本的东西。据我所知,没有办法从查询对象中完整地设置记录?
答案 0 :(得分:2)
我对这个问题做了更多的研究,据我所知,使用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中的主键是非空的,因此当您尝试将表A中的记录1复制到表B时,mysql发现已经存在ID = 1的条目并抛出错误。