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