2015-11-04 61 views
3

有沒有什麼辦法可以將行移動到另一個使用Doctrine的mysql表?symfony doctrine將實體對象移動到另一個實體類型

我正在尋找以下的mysql相當於:

INSERT myTableCopy (
    SELECT * FROM myTable WHERE id = 2 
) 

我希望這樣的事情:

// $first is an object from myTable 
$this->getDoctrine()->getRepository('MyBundle:MyTable')->findOneBy(array('id' => 2)); 
$second = new myTableCopy(); 
$second = clone $first; 

不幸的是(但邏輯上),在$第二實體類型爲myTable的。 ..

我該怎麼做?

我知道我可以使用準備語句,但我想知道是否可以使用Doctrine函數之一來完成此操作。

FYI:我有一個巨大的表(幾百萬行),我想舊數據移動到不會這麼使用

PS一個「備份表」:我知道this thread提議以下解決方案,但我認爲應該有與串行器/正規化一個更好的辦法...

// now loop over the properties of each post array... 
    foreach ($post as $property => $value) { 
     // create a setter 
     $method = sprintf('set%s', ucwords($property)); // or you can cheat and omit ucwords() because PHP method calls are case insensitive 
     // use the method as a variable variable to set your value 
     $post->$method($value); 
    } 
+0

改變這種'> getRepository('MyBundle似乎不守恆: myTableCopy')'。這應該是實體名稱 –

+0

@Abdulla,如問題中所述,我想將MyTable中的一行復制/移動到MyTableCopy。我將如何能夠選擇我想從MyTableCopy複製的對象? – Bast

+0

只需用setter或構造函數填充您的數據即可。 – chapay

回答

2

我終於找到了錯誤的@Colin閱讀this post M.

這裏是我的問題的最終解決方案:

$myOriginalObject = $this->getDoctrine()->getRepository('MyBundle:MyTable')->findOneBy(array('id' => 2)); 
// Here modify the original object if needed... 

$myTableCopyObject = new myTableCopy(); 

$oldReflection = new \ReflectionObject($myOriginalObject); 
$newReflection = new \ReflectionObject($myTableCopyObject); 

foreach ($oldReflection->getProperties() as $property) { 
    if ($newReflection->hasProperty($property->getName())) { 
     $newProperty = $newReflection->getProperty($property->getName()); 
     $newProperty->setAccessible(true); 
     $property->setAccessible(true); 
     $newProperty->setValue($myTableCopyObject, $property->getValue($doi_tmp)); 
    } 
}    

$this->em->persist($myTableCopyObject); 
$this->em->remove($myOriginalObject); 
$this->em->flush(); 

注意:只有ID,當你有一個自動增加的ID

相關問題