我需要你的持久数据帮助,我解释说: 我有变量的实体播放器参考团队:
class DataPlayer
{
/**
* @ORM\ManyToOne(targetEntity="Team")
* @ORM\JoinColumn(name="tag_team", referencedColumnName="tag_team")
*/
private $team;
...
}
但是当我包含数据时,我只有团队标签,而不是实体团队...... 因为团队可能不在数据库中(我包括团队)。 如何设置团队使用字符串(直接标记)whitout来更改实体播放器
感谢!
答案 0 :(得分:1)
好的,我相信我看到了你想要实现的目标。
您正在进行某种导入,并且在foreach
循环期间,您需要创建与Team
相关联的DataPlayer
个实体。显然,你不希望在第一个团队使用某个标签后最终成为多个团队,但由于你还没有使用实体管理器执行flush()
,你可以&# 39; t 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;
}