2016-12-01 96 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