Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

symfony doctrine move an entity object to another entity type

Is there any way to move a row to another mysql table with Doctrine?

I am searching for the equivalent of the following mysql:

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

I expect something like this:

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

Unfortunately (but logically), the $second entity is of type myTable...

How can I do this?

I know I can use prepare statement, but I want to know if I can do this with one of the Doctrine function.

FYI: I have a huge table (several millions of rows), and I want to move old data to a "backup table" that would not be so used

PS: I know that this thread is proposing the following solution, but I think that there should be a better way with serializer/normalizer...

 // 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);
    }
like image 229
Bast Avatar asked Dec 11 '25 23:12

Bast


1 Answers

I finally found the error after reading this post from @Colin M.

Here is the final solution of my problem:

$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();

NB: only the ID seem to not be conserved when you have an auto-increment ID

like image 127
Bast Avatar answered Dec 13 '25 12:12

Bast