2014-09-25 53 views
0

,我需要你的持久化數據幫助之前在foreach循環多個Doctrine對象相關聯,我來解釋一下: 我有實體播放器變量是指團隊:如何沖洗實體管理器

class DataPlayer 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Team") 
    * @ORM\JoinColumn(name="tag_team", referencedColumnName="tag_team") 
    */ 
    private $team; 
    ... 
} 

但是當我包括數據,我只有團隊的標籤,而不是實體團隊...... 因爲團隊不大可能出現在數據庫(我包括團隊之後)。 我該怎麼做才能設置團隊與字符串(標籤直接)缺席改變實體球員

謝謝!

+2

雖然我處理隨着學說和Symfony2每天,我不明白你的問題。 – sjagr 2014-09-25 15:23:45

+0

我會這樣做:$ dataP = new DataPlayer(); $ dataP-> setTeam($標籤)); $ tag是字符串! – Freddy 2014-09-25 15:45:25

+0

您必須將'Team'對象設置爲'setTeam()'函數。如果團隊不存在......你必須創建它! – sjagr 2014-09-25 15:57:53

回答

0

好的,我相信我看到你想要達到的目標。

您正在進行某種導入,並且在foreach循環中,您正在創建TeamDataPlayer關聯的實體。很明顯,您不希望在用特定標籤創建第一個團隊後結束多個團隊,但由於您尚未使用實體管理器執行flush(),因此團隊不能登錄findOneByTag()但存在於數據庫中。

這顯然是有問題的。那麼解決方案是什麼?創建一個臨時數組!

$tempTeams = array(); 
foreach($teams as $team){ 
    $info = explode(',', str_replace("'", "", $team)); 
    if (isset($tempTeams[$info[1]])) { 
     $db_team = $tempTeams[$info[1]]; 
    } else { 
     $db_team = $db->getRepository("ApplicationTestBundle:Team")->findOneByTag($info[1]); 
    } 
    if(!$db_team){ 
     $db_team = new Team(); 
     $db_team->setTag($info[1]); 
     $db_team->setName($info[0]); 
     $em->persist($db_team); 
     $tempTeams[$info[1]] = $db_team; 
    } 
    $dataT = new DataTeam(); 
    $dataT->setTeam($db_team); 
    $em->persist($dataT); 
    $db_team = false; // Need to make sure $db_team is cleared out for the next iteration of the foreach 
} 

這需要所有臨時PHP對象的持久性和緩衝區入臨時數組,它可以讓你沒有任何問題回顧標籤名新對象之前。另一種解決方案是$em->flush();$em->persist($db_team);

然後,您可以訪問$tempTeams陣列以後查找(我相信有使用$info[4]的標籤這次的問題):

foreach($players as $player){ 
    $info = explode(',', str_replace("'", "", $player)); 
    $db_player = $db->getRepository("ApplicationTestBundle:Player")->findOneByPseudo($info[1]); 
    $dataJ = new DataPlayer(); 
    $dataJ->setJoueur($db_player); 
    if (isset($tempTeams[$info[4]])) { 
     $db_team = $tempTeams[$info[4]]; 
    } else { 
     $db_team = $db->getRepository("ApplicationTestBundle:Team")->findOneByTag($info[4]); 
    } 
    $dataJ->setTeam($db_team); 
    $em->persist($dataJ); 
    $db_team = false; 
} 
+0

是的,你保存對象,當然我創建當然最好的方式謝謝! – Freddy 2014-09-25 18:30:46