Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在刷新实体管理器之前,如何在foreach循环中关联多个条令对象_Php_Symfony_Doctrine - Fatal编程技术网

Php 在刷新实体管理器之前,如何在foreach循环中关联多个条令对象

Php 在刷新实体管理器之前,如何在foreach循环中关联多个条令对象,php,symfony,doctrine,Php,Symfony,Doctrine,我需要您的帮助来保存数据,我解释: 我有一个实体玩家,他有一个可变的团队: class DataPlayer { /** * @ORM\ManyToOne(targetEntity="Team") * @ORM\JoinColumn(name="tag_team", referencedColumnName="tag_team") */ private $team; ... } 但当我包含数据时,我只有团队的标签,而不是实体团队的标签。。。

我需要您的帮助来保存数据,我解释: 我有一个实体玩家,他有一个可变的团队:

class DataPlayer
{
    /**
     * @ORM\ManyToOne(targetEntity="Team")
     * @ORM\JoinColumn(name="tag_team", referencedColumnName="tag_team")
     */
    private $team;
    ...
}
但当我包含数据时,我只有团队的标签,而不是实体团队的标签。。。 因为团队可能不存在于数据库中(我包括了之后的团队)。 我如何设置带有字符串(直接标记)的团队来更改实体播放器


谢谢!

好吧,我相信我看到了你想要实现的目标

您正在进行某种导入,并且在
foreach
循环期间,您正在创建与
DataPlayer
关联的
Team
实体。显然,您不希望在使用某个标记创建第一个团队后创建多个团队,但由于您尚未使用实体管理器执行
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\u团队)之后

然后,您可以访问
$tenteams
数组以供以后查找(我认为这次使用
$info[4]
标记时存在问题):


虽然我每天都在处理Doctrine和Symfony2,但我无法理解你的问题$dataP->settam($tag))$标签是字符串!您必须将
Team
对象设置为
settam()
函数。如果团队还不存在。。。你必须创造它!团队是创造和坚持之前,但不是齐平!设置团队时,我无法访问团队对象请显示控制器操作函数的代码,包括创建/保留团队对象的函数
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;
}