2016-12-01 111 views
0

尝试在MongoDB中持久化对象。我是MongoDB和Symfony的新手。Symfony2 Mongodb多次持久化对象

我的代码如下:

$neo = new Neo(); 
    $dm = $this->getContainer()->get('doctrine_mongodb')->getManager(); 


    $jd = new JsonDecode(); 
    $neo_obj = $jd->decode($response->getBody(),"json"); 
    foreach($neo_obj->near_earth_objects as $date => $object) { 
     $output->writeln("Date:".$date); 

     $neo->setDate($date); 

     foreach($neo_obj->near_earth_objects as $object1) { 
     foreach($object1 as $object2) 
     { 
      $output->writeln("Name:".$object2->name); 

      $neo->setName($object2->name); 

      $output->writeln("neo_reference_id:".$object2->neo_reference_id); 

      $neo->setNeoReferenceId($object2->neo_reference_id); 

      $output->writeln("is_potentially_hazardous_asteroid:".$object2->is_potentially_hazardous_asteroid); 

      $neo->setIsPotentiallyHazardousAsteroid($object2->is_potentially_hazardous_asteroid); 

      foreach($object2->close_approach_data as $object3) 
      { 
      $i=0; 
      foreach($object3->relative_velocity as $object4) 
      { 
       if($i===1) 
       { 
       $output->writeln("kilometers_per_hour:".$object4); 
       $neo->setSpeed($object4); 
       $dm->persist($neo); 
       $dm->flush(); 
       } 
       $i=$i+1; 
      } 
      } 


     } 
     } 
    } 

遗憾的是,只有最后一个对象被保存。

我使用Robomongo查看它...只看到最新的入门:(

任何想法如何正确地做到这一点?

还怎么能我的代码进行优化,以提高可读性和性能改进?

Tahnks,

更新1:

改变了我的合作对此,通过删除一个额外的循环来优化它。

@Gerry:

这是你的意思是在每个循环创建新对象,并坚持比它循环到底是什么?

该代码可以以某种方式优化吗?更好的可读性?

感谢,

$dm = $this->getContainer()->get('doctrine_mongodb')->getManager(); 


$jd = new JsonDecode(); 
$neo_obj = $jd->decode($response->getBody(),"json"); 
foreach($neo_obj->near_earth_objects as $date => $object1) { 

    foreach($object1 as $object2) 
    { 
     $neo = new Neo(); 

     $output->writeln("Date:".$date); 

     $neo->setDate($date); 

     $output->writeln("Name:".$object2->name); 

     $neo->setName($object2->name); 

     $output->writeln("neo_reference_id:".$object2->neo_reference_id); 

     $neo->setNeoReferenceId($object2->neo_reference_id); 

     $output->writeln("is_potentially_hazardous_asteroid:".$object2->is_potentially_hazardous_asteroid); 

     $neo->setIsPotentiallyHazardousAsteroid($object2->is_potentially_hazardous_asteroid); 

     foreach($object2->close_approach_data as $object3) 
     { 
     $i=0; 
     foreach($object3->relative_velocity as $object4) 
     { 
      if($i===1) 
      { 
      $output->writeln("kilometers_per_hour:".$object4); 
      $neo->setSpeed($object4); 
      $dm->persist($neo); 
      $dm->flush(); 
      } 
      $i=$i+1; 
     } 
     } 


    } 

} 

回答

0

坚持同一目标多次没有效果,你只需要一次坚持一个对象,它会成为学说“管理”。

在这段代码中,你基本上是一遍又一遍地更新同一个实体。如果要批量创建这些对象,则需要在迭代中调用构造函数,并在您的类的每个唯一实例上调用persist。

+0

谢谢。我根据您的建议更新了Update 1和新代码的问题。它现在可以工作......它可以做得更好吗?遵循最佳实践或阅读/性能优化? –

+0

你应该限制一个StackOverflow问题的一个问题。随意创建一个不同的问题,虽然关于优化和接受这个答案关于您的原始问题。 – Gerry