如何在刷新实体管理器之前关联foreach循环中的多个Doctrine对象

时间:2014-09-25 15:22:35

标签: php symfony doctrine

我需要你的持久数据帮助,我解释说: 我有变量的实体播放器参考团队:

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

但是当我包含数据时,我只有团队标签,而不是实体团队...... 因为团队可能不在数据库中(我包括团队)。 如何设置团队使用字符串(直接标记)whitout来更改实体播放器

感谢!

1 个答案:

答案 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;
}