好的,我相信我看到你想要達到的目標。
您正在進行某種導入,並且在foreach
循環中,您正在創建Team
與DataPlayer
關聯的實體。很明顯,您不希望在用特定標籤創建第一個團隊後結束多個團隊,但由於您尚未使用實體管理器執行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;
}
雖然我處理隨着學說和Symfony2每天,我不明白你的問題。 – sjagr 2014-09-25 15:23:45
我會這樣做:$ dataP = new DataPlayer(); $ dataP-> setTeam($標籤)); $ tag是字符串! – Freddy 2014-09-25 15:45:25
您必須將'Team'對象設置爲'setTeam()'函數。如果團隊不存在......你必須創建它! – sjagr 2014-09-25 15:57:53