2015-02-06 71 views
1

我得到了两个实体。 这是第一个具有一对多releation:symfony2学说如何在持续之后更新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; 
} 

这是第二个具有reverst多对一releation:

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" [] [] 
+0

你说MargetLanguage实体不更新,那么为什么在日志文件中有UPDATE语句? – qtuan 2015-02-06 08:08:24

回答

0

看起来像这个问题是因为由于该MarketLanguage ID是固定的,:

private $marketId = 0; 

请再试一次,而不= 0

编辑:由于您使用“无”ID生成策略,您必须手动为您的MarketLanguage实体分配ID。请参阅doc

+0

如果我这样做,我得到此错误:Acme \ CMSBundle \ Entity \ MarketLanguage类型的实体缺少为字段'marketId'分配ID。此实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段。如果您想要自动生成标识符,则需要相应地调整元数据映射。 – 2015-02-06 08:18:22

+0

然后很明显。为什么你们都指定'GeneratedValue'和策略“NONE”? Fom doc:'NONE与完全抛弃@GeneratedValue相同。'所以你应该这样做:使用另一种策略并删除$ marketId – qtuan 2015-02-06 08:21:58

+0

@DonatasVeikutis的默认值我看到你正在使用'MarketLanguage'的组合键。并且''marketId'看起来就是父'MarketMain'的ID。如果是这样,你的用例与[this]类似(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-1-动态属性) – qtuan 2015-02-06 08:36:32

0

$ marketMain =新MarketMain();您正在创建新实例,以

$marketMain->getMarketLanguage() 

将返回空数组,也许你应该从数据库中查询所有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(); 
+0

对不起,我做错了,我不显示我创建MarketLanguage的实体,我更新了我的问题 – 2015-02-06 08:06:51

+0

@DonatasVeikutis我更新了答案 – szapio 2015-02-06 08:11:10