symfony2 学说如何在坚持后更新 OneToMany 实体?
symfony2 doctrine how to update OneToMany entities after persist?
我得到了两个实体。
这是第一个具有 OneToMany 关系的:
class MarketMain
{
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="\Acme\CMSBundle\Entity\MarketLanguage", mappedBy="marketMain", indexBy="langId", cascade="all", orphanRemoval=true, fetch="EXTRA_LAZY")
*/
private $marketLanguage;
}
这是第二个反转 ManyToOne 关系的:
class MarketLanguage
{
/**
* @var integer
*
* @ORM\Column(name="market_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $marketId = 0;
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(name="lang_id", type="integer", nullable=false)
*/
private $langId = 1;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=200, nullable=true)
*/
private $name;
/**
* @var \Acme\CMSBundle\Entity\MarketMain
*
* @ORM\ManyToOne(targetEntity="\Acme\CMSBundle\Entity\MarketMain", inversedBy="marketLanguage")
* @ORM\JoinColumn(name="market_id", referencedColumnName="id")
*/
private $marketMain;
}
我想像这样保存实体:
$em = $this->getDoctrine()->getManager();
$marketMain = new MarketMain();
$marketLanguage = new ArrayCollection();
$marketLanguage->set(1,new MarketLanguage());
$marketLanguage->set(2,new MarketLanguage());
$marketLanguage->set(3,new MarketLanguage());
$marketMain->setMarketLanguage($marketLanguage);
foreach ($marketMain->getMarketLanguage() as $market_language)
{
$market_language->setMarketMain($marketMain);
}
$em->persist($marketMain);
$em->flush();
foreach ($marketMain->getMarketLanguage() as $market_language)
{
$market_language->setName("Default name for MarketMain entity id:".$marketMain->getId());
}
$em->flush();
但是在第二次刷新后,我的 MarketLanguage 实体没有更新,在原则查询日志中,我看到 MarketLanguage 实体在坚持使用 MarketMain 后没有关系。请不要说我必须在保留之前设置 MarketLanguage 名称,因为我必须向该名称添加刷新 ID。
这是在第二次刷新中执行更新的查询(来自学说日志):
"START TRANSACTION" [] []
UPDATE market_language SET name = ? WHERE market_id = ? AND lang_id = ? ["Default name for MarketMain entity 15",0,"1"] []
"COMMIT" [] []
$marketMain = new MarketMain();您正在创建新实例,因此
$marketMain->getMarketLanguage()
将 return 空数组,也许您应该从数据库中查询所有 MarketLanguages,然后将它们分配给 MarketMain?
$langs = $em->getRepositiory('Bundle:MarketLanguage')->findAll()
foreach ($langs as $market_language)
{
$market_language->setMarketMain($marketMain);
}
$em->persist($marketMain);
$em->flush();
编辑:
所以试试这个:
$ml1 = new MarketLanguage();
$ml2 = new MarketLanguage();
$ml3 = new MarketLanguage();
$marketLanguage->set(1,$ml1);
$marketLanguage->set(2,$ml2);
$marketLanguage->set(3,$ml3);
$marketMain->setMarketLanguage($marketLanguage);
foreach ($marketMain->getMarketLanguage() as $market_language)
{
$market_language->setMarketMain($marketMain);
}
$em->persist($marketMain);
$em->persist($ml1);
$em->persist($ml2);
$em->persist($ml3);
$em->flush();
看起来问题是由于 MarketLanguage ID 已修复,因为:
private $marketId = 0;
请在没有= 0
的情况下重试
编辑:由于您使用 "NONE" ID 生成策略,您必须手动为您的 MarketLanguage 实体分配 ID。参见 doc
我得到了两个实体。 这是第一个具有 OneToMany 关系的:
class MarketMain
{
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="\Acme\CMSBundle\Entity\MarketLanguage", mappedBy="marketMain", indexBy="langId", cascade="all", orphanRemoval=true, fetch="EXTRA_LAZY")
*/
private $marketLanguage;
}
这是第二个反转 ManyToOne 关系的:
class MarketLanguage
{
/**
* @var integer
*
* @ORM\Column(name="market_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $marketId = 0;
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(name="lang_id", type="integer", nullable=false)
*/
private $langId = 1;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=200, nullable=true)
*/
private $name;
/**
* @var \Acme\CMSBundle\Entity\MarketMain
*
* @ORM\ManyToOne(targetEntity="\Acme\CMSBundle\Entity\MarketMain", inversedBy="marketLanguage")
* @ORM\JoinColumn(name="market_id", referencedColumnName="id")
*/
private $marketMain;
}
我想像这样保存实体:
$em = $this->getDoctrine()->getManager();
$marketMain = new MarketMain();
$marketLanguage = new ArrayCollection();
$marketLanguage->set(1,new MarketLanguage());
$marketLanguage->set(2,new MarketLanguage());
$marketLanguage->set(3,new MarketLanguage());
$marketMain->setMarketLanguage($marketLanguage);
foreach ($marketMain->getMarketLanguage() as $market_language)
{
$market_language->setMarketMain($marketMain);
}
$em->persist($marketMain);
$em->flush();
foreach ($marketMain->getMarketLanguage() as $market_language)
{
$market_language->setName("Default name for MarketMain entity id:".$marketMain->getId());
}
$em->flush();
但是在第二次刷新后,我的 MarketLanguage 实体没有更新,在原则查询日志中,我看到 MarketLanguage 实体在坚持使用 MarketMain 后没有关系。请不要说我必须在保留之前设置 MarketLanguage 名称,因为我必须向该名称添加刷新 ID。
这是在第二次刷新中执行更新的查询(来自学说日志):
"START TRANSACTION" [] []
UPDATE market_language SET name = ? WHERE market_id = ? AND lang_id = ? ["Default name for MarketMain entity 15",0,"1"] []
"COMMIT" [] []
$marketMain = new MarketMain();您正在创建新实例,因此
$marketMain->getMarketLanguage()
将 return 空数组,也许您应该从数据库中查询所有 MarketLanguages,然后将它们分配给 MarketMain?
$langs = $em->getRepositiory('Bundle:MarketLanguage')->findAll()
foreach ($langs as $market_language)
{
$market_language->setMarketMain($marketMain);
}
$em->persist($marketMain);
$em->flush();
编辑:
所以试试这个:
$ml1 = new MarketLanguage();
$ml2 = new MarketLanguage();
$ml3 = new MarketLanguage();
$marketLanguage->set(1,$ml1);
$marketLanguage->set(2,$ml2);
$marketLanguage->set(3,$ml3);
$marketMain->setMarketLanguage($marketLanguage);
foreach ($marketMain->getMarketLanguage() as $market_language)
{
$market_language->setMarketMain($marketMain);
}
$em->persist($marketMain);
$em->persist($ml1);
$em->persist($ml2);
$em->persist($ml3);
$em->flush();
看起来问题是由于 MarketLanguage ID 已修复,因为:
private $marketId = 0;
请在没有= 0
编辑:由于您使用 "NONE" ID 生成策略,您必须手动为您的 MarketLanguage 实体分配 ID。参见 doc