簡體   English   中英

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 =新的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();

看起來問題是由於MarketLanguage ID是固定的,原因如下:

private $marketId = 0;

請重試,不設置= 0

編輯:由於您使用“無” ID生成策略,您必須手動為您的MarketLanguage實體分配ID。 文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM