2015-02-06 74 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