Zend 2 - 教义如何为三个实体插入一对多?
Posted
技术标签:
【中文标题】Zend 2 - 教义如何为三个实体插入一对多?【英文标题】:Zend 2 - doctrine how to insert one to many for three entities? 【发布时间】:2015-03-30 11:42:49 【问题描述】:我有这个场景,三个表(有自己的 id)
Concurso (id 130)
Country Canada (id 1)
Languages French (id 20)
English (id 40)
Country USA (id 2)
Language English (id 40)
Spanish (id 33)
Country Italy (id 5)
Language Italian (id 99)
目标是进入表格 concursoCountry,我将在其中拥有这些字段
con_id (concurso_id) cou_id (country_id) lan_id (language_id)
我将插入这些记录
130 1 20
130 1 40
130 2 40
130 2 33
130 5 99
所有表都是与表 Concurso、Country 和 Languages 的正确关系 FK,并且使用我将在之后发布的代码,我只能将一条记录插入到表 ConcursoCountry 中。
我想我必须同时对所有记录进行持久化和刷新,但我不明白如何。
这是我的代码,提前感谢您的任何建议
public function create($params)
//echo "<pre>";
//print_r($params);
$stringCountry = "cou_id";
$arrayIdLanguage = array();
$concurso = new $this->entity;
$concursoCountry = new $this->entityConcursoCountry;
$host = new \Application\Model\DB\Host($this->em);
$concurso->setHos($host->find(1));
$image = new \Application\Model\DB\Image($this->em);
$concurso->setConIma($image->find(1));
$concurso->setConName($params['con_name']);
$concurso->setConDescription($params['con_description']);
$concurso->setConTitle($params['con_name']);
... other information fields...
$this->em->persist($concurso);
$this->em->flush();
$concursoCountry->setCon($concurso);
foreach ($params as $keyCounty=>$valueCountry)
$posCounntry = strpos($keyCounty, $stringCountry);
if($posCounntry === false)
//
else
$country = new \Application\Model\DB\Country($this->em);
$concursoCountry->setCou($country->find($params[$keyCounty]));
$piecesCountry = explode("_", $keyCounty);
$indexCountry = $piecesCountry[2];
$stringLanguage = "lan_id_".$indexCountry;
foreach ($params as $keyLan=>$valueLan)
$posLang = strpos($keyLan, $stringLanguage);
if($posLang === false)
//
else
$language = new \Application\Model\DB\Language($this->em);
$concursoCountry->setLan($language->find($params[$keyLan]));
$this->em->persist($concursoCountry);
$this->em->flush();
return true;
这是实体/Concurso.php (有几个信息字段不是必须的
cur = new \Doctrine\Common\Collections\ArrayCollection(); $this->mod = new \Doctrine\Common\Collections\ArrayCollection(); /** * 获取conId * * @return 整数 */ 公共函数 getConId() 返回 $this->conId; /** * 设置conName * * @param 字符串 $conName * @return 同意 */ 公共函数 setConName($conName) $this->conName = $conName; 返回$这个; /** * 获取连接名 * * @return 字符串 */ 公共函数 getConName() 返回 $this->conName; /** * 设置conDescription * * @param 字符串 $conDescription * @return 同意 */ 公共函数 setConDescription($conDescription) $this->conDescription = $conDescription; 返回$这个; /** * 获取说明 * * @return 字符串 */ 公共函数 getConDescription() 返回 $this->conDescription; /** * 设置标题 * * @param 字符串 $conTitle * @return 同意 */ 公共函数 setConTitle($conTitle) $this->conTitle = $conTitle; 返回$这个; /** * 获取标题 * * @return 字符串 */ 公共函数 getConTitle() 返回 $this->conTitle; /** * 设置conTemplateHeader * * @param 字符串 $conTemplateHeader * @return 同意 */ 公共函数 setConTemplateHeader($conTemplateHeader) $this->conTemplateHeader = $conTemplateHeader; 返回$这个; /** * 获取conTemplateHeader * * @return 字符串 */ 公共函数 getConTemplateHeader() 返回 $this->conTemplateHeader; /** * 设置模板页脚 * * @param 字符串 $conTemplateFooter * @return 同意 */ 公共函数 setConTemplateFooter($conTemplateFooter) $this->conTemplateFooter = $conTemplateFooter; 返回$这个; /** * 获取模板页脚 * * @return 字符串 */ 公共函数 getConTemplateFooter() 返回 $this->conTemplateFooter; /** * 设置转换 * * @param 字符串 $conVersion * @return 同意 */ 公共函数 setConVersion($conVersion) $this->conVersion = $conVersion; 返回$这个; /** * 获取转换 * * @return 字符串 */ 公共函数 getConVersion() 返回 $this->conVersion; /** * 设置 conEmailNotice * * @param string $conEmailNotice * @return 同意 */ 公共函数 setConEmailNotice($conEmailNotice) $this->conEmailNotice = $conEmailNotice; 返回$这个; /** * 获取 conEmailNotice * * @return 字符串 */ 公共函数 getConEmailNotice() 返回 $this->conEmailNotice; /** * 设置 conConfResEnt * * @param 整数 $conConfResEnt * @return 同意 */ 公共函数 setConConfResEnt($conConfResEnt) $this->conConfResEnt = $conConfResEnt; 返回$这个; /** * 获取 conConfResEnt * * @return 整数 */ 公共函数 getConConfResEnt() 返回 $this->conConfResEnt; /** * 设置 conConfUniResEnt * * @param boolean $conConfUniResEnt * @return 同意 */ 公共函数 setConConfUniResEnt($conConfUniResEnt) $this->conConfUniResEnt = $conConfUniResEnt; 返回$这个; /** * 获取 conConfUniResEnt * * @return 布尔值 */ 公共函数 getConConfUniResEnt() 返回 $this->conConfUniResEnt; /** * 设置 conConfUniResJob * * @param 整数 $conConfUniResJob * @return 同意 */ 公共函数 setConConfUniResJob($conConfUniResJob) $this->conConfUniResJob = $conConfUniResJob; 返回$这个; /** * 获取 conConfUniResJob * * @return 整数 */ 公共函数 getConConfUniResJob() 返回 $this->conConfUniResJob; /** * 设置居屋 * * @param \Application\Entity\Host $hos * @return 同意 */ 公共函数 setHos(\Application\Entity\Host $hos = null) $this->hos = $hos; 返回$这个; /** * 获得居屋 * * @return \Application\Entity\Host */ 公共函数 getHos() 返回 $this->hos; /** * 设置 conIma * * @param \Application\Entity\Image $conIma * @return 同意 */ 公共函数 setConIma(\Application\Entity\Image $conIma = null) $this->conIma = $conIma; 返回$这个; /** * 获取 conIma * * @return \应用程序\实体\图像 */ 公共函数 getConIma() 返回 $this->conIma; /** * 添加当前 * * @param \Application\Entity\Currency $cur * @return 同意 */ 公共函数 addCur(\Application\Entity\Currency $cur) $this->cur[] = $cur; 返回$这个; /** * 删除当前 * * @param \Application\Entity\Currency $cur */ 公共函数 removeCur(\Application\Entity\Currency $cur) $this->cur->removeElement($cur); /** * 获取当前 * * @return \Doctrine\Common\Collections\Collection */ 公共函数 getCur() 返回 $this->cur; /** * 添加模组 * * @param \Application\Entity\Module $mod * @return 同意 */ 公共函数 addMod(\Application\Entity\Module $mod) $this->mod[] = $mod; 返回$这个; /** * 移除模组 * * @param \Application\Entity\Module $mod */ 公共函数 removeMod(\Application\Entity\Module $mod) $this->mod->removeElement($mod); /** * 获取模组 * * @return \Doctrine\Common\Collections\Collection */ 公共函数 getMod() 返回 $this->mod; 实体语言.php 命名空间应用\实体; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * 语言 * * @ORM\Table(name="语言") * @ORM\实体 */ 类语言 /** * @var 整数 * * @ORM\Column(name="lan_id", type="integer", precision=0, scale=0, nullable=false, unique=false) * @ORM\ID * @ORM\GeneratedValue(strategy="IDENTITY") */ 私人 $lanId; /** * @var 字符串 * * @ORM\Column(name="code", type="string", length=2, precision=0, scale=0, nullable=false, unique=false) */ 私人$代码; /** * @var 字符串 * * @ORM\Column(name="name", type="string", length=45, precision=0, scale=0, nullable=false, unique=false) */ 私人 $name; /** * @var 字符串 * * @ORM\Column(name="charset", type="string", length=45, precision=0, scale=0, nullable=false, unique=false) */ 私人 $charset; /** * @var 布尔值 * * @ORM\Column(name="position", type="boolean", precision=0, scale=0, nullable=false, unique=false) */ 私人$位置; /** * @var 布尔值 * * @ORM\Column(name="main", type="boolean", precision=0, scale=0, nullable=false, unique=false) */ 私人 $main; /** * @var 布尔值 * * @ORM\Column(name="active", type="boolean", precision=0, scale=0, nullable=false, unique=false) */ 私人$活动; /** * 获取局域网 * * @return 整数 */ 公共函数 getLanId() 返回 $this->lanId; /** * 设置代码 * * @param 字符串 $code * @return 语言 */ 公共函数 setCode($code) $this->code = $code; 返回$这个; /** * 获取代码 * * @return 字符串 */ 公共函数 getCode() 返回 $this-> 代码; /** * 设置名称 * * @param 字符串 $name * @return 语言 */ 公共函数 setName($name) $this->name = $name; 返回$这个; /** * 获取名称 * * @return 字符串 */ 公共函数 getName() 返回 $this->name; /** * 设置字符集 * * @param 字符串 $charset * @return 语言 */ 公共函数 setCharset($charset) $this->charset = $charset; 返回$这个; /** * 获取字符集 * * @return 字符串 */ 公共函数 getCharset() 返回 $this->charset; /** * 设置位置 * * @param boolean $位置 * @return 语言 */ 公共函数 setPosition($position) $this->位置 = $位置; 返回$这个; /** * 获取位置 * * @return 布尔值 */ 公共函数 getPosition() 返回 $this-> 位置; /** * 设置主要 * * @param 布尔值 $main * @return 语言 */ 公共函数 setMain($main) $this->main = $main; 返回$这个; /** * 获取主要内容 * * @return 布尔值 */ 公共函数 getMain() 返回 $this->main; /** * 设置激活 * * @param 布尔值 $active * @return 语言 */ 公共函数 setActive($active) $this->active = $active; 返回$这个; /** * 活跃起来 * * @return 布尔值 */ 公共函数 getActive() 返回 $this->active; 实体国家 命名空间应用\实体; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * 国家 * * @ORM\Table(name="国家") * @ORM\实体 */ 类国家 /** * @var 整数 * * @ORM\Column(name="cou_id", type="integer", precision=0, scale=0, nullable=false, unique=false) * @ORM\ID * @ORM\GeneratedValue(strategy="IDENTITY") */ 私人 $couId; /** * @var 字符串 * * @ORM\Column(name="name", type="string", length=150, precision=0, scale=0, nullable=false, unique=false) */ 私人 $name; /** * @var 字符串 * * @ORM\Column(name="code", type="string", length=3, precision=0, scale=0, nullable=false, unique=false) */ 私人$代码; /** * @var 字符串 * * @ORM\Column(name="flag", type="string", length=45, precision=0, scale=0, nullable=false, unique=false) */ 私人$标志; /** * @var 字符串 * * @ORM\Column(name="geoip", type="string", length=45, precision=0, scale=0, nullable=false, unique=false) */ 私人 $geoip; /** * 获取身份 * * @return 整数 */ 公共函数 getCouId() 返回 $this->couId; /** * 设置名称 * * @param 字符串 $name * @return 国家 */ 公共函数 setName($name) $this->name = $name; 返回$这个; /** * 获取名称 * * @return 字符串 */ 公共函数 getName() 返回 $this->name; /** * 设置代码 * * @param 字符串 $code * @return 国家 */ 公共函数 setCode($code) $this->code = $code; 返回$这个; /** * 获取代码 * * @return 字符串 */ 公共函数 getCode() 返回 $this-> 代码; /** * 设置标志 * * @param 字符串 $flag * @return 国家 */ 公共函数 setFlag($flag) $this->flag = $flag; 返回$这个; /** * 获取标志 * * @return 字符串 */ 公共函数 getFlag() 返回 $this-> 标志; /** * 设置地理IP * * @param 字符串 $geoip * @return 国家 */ 公共函数 setGeoip($geoip) $this->geoip = $geoip; 返回$这个; /** * 获取地理IP * * @return 字符串 */ 公共函数 getGeoip() 返回 $this->geoip; 实体 ConcursoCountry 命名空间应用\实体; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * ConcursoCountry * * @ORM\Table(name="concurso_country", 索引=@ORM\Index(name="fk_concurso_country_country_idx", columns="cou_id"), @ORM\Index(name="fk_concurso_country_language_idx", columns=" lan_id"), @ORM\Index(name="IDX_D8E1022D6639A0D9", columns="con_id")) * @ORM\实体 */ 类 ConcursoCountry /** * @var \Application\Entity\Concurso * * @ORM\ID * @ORM\GeneratedValue(strategy="NONE") * @ORM\OneToOne(targetEntity="Application\Entity\Concurso") * @ORM\JoinColumns( * @ORM\JoinColumn(name="con_id", referencedColumnName="con_id", nullable=true) * ) */ 私人 $con; /** * @var \Application\Entity\Country * * @ORM\ID * @ORM\GeneratedValue(strategy="NONE") * @ORM\OneToOne(targetEntity="Application\Entity\Country") * @ORM\JoinColumns( * @ORM\JoinColumn(name="cou_id", referencedColumnName="cou_id", nullable=true) * ) */ 私人$cou; /** * @var \Application\Entity\Language * * @ORM\ID * @ORM\GeneratedValue(strategy="NONE") * @ORM\OneToOne(targetEntity="Application\Entity\Language") * @ORM\JoinColumns( * @ORM\JoinColumn(name="lan_id", referencedColumnName="lan_id", nullable=true) * ) */ 私人 $lan; /** * 设置骗局 * * @param \Application\Entity\Concurso $con * @return ConcursoCountry */ 公共函数 setCon(\Application\Entity\Concurso $con) $this->con = $con; 返回$这个; /** * 得到骗局 * * @return \Application\Entity\Concurso */ 公共函数 getCon() 返回 $this->con; /** * 设置凑 * * @param \Application\Entity\Country $cou * @return ConcursoCountry */ 公共函数 setCou(\Application\Entity\Country $cou) $this->cou = $cou; 返回$这个; /** * 搞定 * * @return \Application\Entity\Country */ 公共函数 getCou() 返回 $this->cou; /** * 设置局域网 * * @param \Application\Entity\Language $lan * @return ConcursoCountry */ 公共函数 setLan(\Application\Entity\Language $lan) $this->lan = $lan; 返回$这个; /** * 获取局域网 * * @return \Application\Entity\Language */ 公共函数 getLan() 返回 $this->lan;【问题讨论】:
【参考方案1】:首先创建父母,然后创建孩子,然后在孩子中设置父母(FK)。 在创建每个对象后持续存在,最后只刷新一次。
【讨论】:
【参考方案2】:感谢您的重播。 但我只是按照你的建议做了,但它没有运行。 我只会发布必要的代码。
$this->em->persist($concurso);
$this->em->flush(); <--- CREATE THE PARENT
$concursoCountry->setCon($concurso);
foreach ($params as $keyCounty=>$valueCountry)
$posCounntry = strpos($keyCounty, $stringCountry);
if($posCounntry === false)
//
else
$country = new \Application\Model\DB\Country($this->em);
$concursoCountry->setCou($country->find($params[$keyCounty])); <--- SET COUNTRY in ConcursoCountry
$piecesCountry = explode("_", $keyCounty);
$indexCountry = $piecesCountry[2];
$stringLanguage = "lan_id_".$indexCountry;
foreach ($params as $keyLan=>$valueLan)
$posLang = strpos($keyLan, $stringLanguage);
if($posLang === false)
//
else
$language = new \Application\Model\DB\Language($this->em);
$concursoCountry->setLan($language->find($params[$keyLan]));
$this->em->persist($concursoCountry); <--- SET AN D PERSIST LANGUAGE for ConcursoCountry
$this->em->flush(); <--- ONLY ONE FLUSH
我将在 ConcursoCountry 只有一条记录。
注意:Language 和 Country 是参数表,所以在我执行这段代码之前,数据已经在里面了。
【讨论】:
【参考方案3】:我以这种方式修改了代码,而且如果我的 concursoCountry 中只有一条记录,我想这是解决我的问题的正确模式。 但我不明白我错在哪里。
.....other data for the table Concurso
$concurso->setconConfUniResJob(1);
$this->em->persist($concurso);
$this->em->flush();
foreach ($params as $keyCounty=>$valueCountry)
$iCountry = $iCountry +1;
$posCounntry = strpos($keyCounty, $stringCountry);
if($posCounntry === false)
//
else
$"concursoCountry".$iCountry = new $this->entityConcursoCountry;
$"concursoCountry".$iCountry->setCon($concurso);
$"country".$iCountry = new \Application\Model\DB\Country($this->em);
$"concursoCountry".$iCountry->setCou($"country".$iCountry->find($params[$keyCounty]));
$piecesCountry = explode("_", $keyCounty);
$indexCountry = $piecesCountry[2];
$stringLanguage = "lan_id_".$indexCountry;
foreach ($params as $keyLan=>$valueLan)
$iLang = $iLang +1;
$posLang = strpos($keyLan, $stringLanguage);
if($posLang === false)
//
else
$"language".$iLang = new \Application\Model\DB\Language($this->em);
$"concursoCountry".$iCountry->setLan($"language".$iLang->find($params[$keyLan]));
$this->em->persist($"concursoCountry".$iCountry);
$this->em->flush();
【讨论】:
以上是关于Zend 2 - 教义如何为三个实体插入一对多?的主要内容,如果未能解决你的问题,请参考以下文章