2015-02-11 88 views
0

我在Doctrine中拥有多对多的双向关系。它将项目与类别关联。问题是,在开始时我正确地为项目分配了一个类别,但是当我尝试更新项目的类别时,它失败了,并且具有重复的主键。与Doctrine的多对多双向关系

这些都是从代码可能有帮助的一些片段:

/** 
* @ORM\Table(name="item") 
* @ORM\Entity(repositoryClass="SomeBundle\Entity\Repository\ItemRepository") 
* 
*/ 
class Item 
{ 
/** 
    * @ORM\ManyToMany(targetEntity="Category", inversedBy="items", cascade={"persist"}) 
    **/ 
    private $categories; 
public function __construct() 
    { 
     $this->categories = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
/** 
    * @param Item $item 
    */ 
    public function addItem(Item $item) 
    { 
     $this->items[] = $item; 
    } 

/** 
* Category 
* 
* @ORM\Table(name="category", indexes={@ORM\Index(name="category_parent", columns={"parent_id"})}) 
* @ORM\Entity(repositoryClass="SomeBundle\Entity\Repository\CategoryRepository") 
* @ORM\HasLifecycleCallbacks 
*/ 
class Category 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="Item", mappedBy="categories", cascade={"persist"}) 
    * @ORM\JoinTable(name="item_category") 
    **/ 
    private $items; 

    public function __construct() 
    { 
     $this->items = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * @param Category $category 
    */ 
    public function addCategory(Category $category) 
    { 
     $this->categories[] = $category; 
     $category->addItem($this); 
    } 

UPDATE

public function saveItem(Request $request) 
    { 
     $editMode = false; 
     $itemId = $request->request->get('item_id'); 

     if (isset($itemId) && $itemId > 0) { 
      $editMode = true; 
     } 

     $itemName = $request->request->get('itemName'); 
     $itemShortName= $request->request->get('itemShortName'); 

     $itemRepo = $this->getItemRepository(); 
     $item = $itemRepo->find($itemId); 

     // get last Item Id 
     if (!$editMode) { 
      $newItem = new Item(); 
      $newItemId = rand(1000, 6000); // TODO 
      $newItem->setId($newItemId); 
      $newItem->setSection('ar'); 
      // by default the item is inactive 
      $newItem->setActive(0); 
     } 

     //store the Item Type 
     $itemType = new ItemType(); 
     $itemType->setTypeId($request->request->get('itemType')); 

     if (!$editMode) { 
      $itemType->setItemId($newItemId); 
     } 

     // store the data into the ItemTranslation 
     if (!$editMode) { 
      $newItemTranslation = new ItemTranslation(); 
      $newItemTranslation->setItemId($newItemId); 
      $newItemTranslation->setLanguageId('1'); 
      $newItemTranslation->setItemName($itemName); 
      $newItemTranslation->ItemShortname($itemShortName); 
      $newItemTranslation->setTimestampAdd(new \DateTime()); 
      $this->em->persist($newItemTranslation); 
     } 

     //assign the respective Categories to the item 
     $selectedCategoriesIds = $request->request->get('itemCategories'); 
     $categoryRepo = $this->getCategoryRepository(); 

     if (count($selectedCategoriesIds) > 0) { 
      foreach ($selectedCategoriesIds as $selectedCategoryId) { 
       $category = $categoryRepo->find($selectedCategoryId); 
       if (is_object($item)) { //TODO 
        $item->addCategory($category); 
        $category->addItem($item); 

       } else { 
        $newItem->addCategory($category); 
        $category->addItem($newItem); 
       } 

       if (!$editMode) { 
        $this->em->persist($newItem); 
       } 
      } 
     } 

     $this->em->flush(); 
    } 

错误消息

An exception occurred while executing 'INSERT INTO item_category (item_id, category_id) VALUES (?, ?)' with params [2117, 1]: 

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2117-1' for key 'PRIMARY' 

**第二更新**

我已经加入此 如果(is_object($项)){$ 用品 - > removeExistingCategories(); } 之前:

if (count($selectedCategoriesIds) > 0) { 
      foreach ($selectedCategoriesIds as $selectedCategoryId) { 
       $category = $categoryRepo->find($selectedCategoryId); 

,似乎它工作得很好,与现在的类别被在UI两次出现异常,虽然item_category表已经被正确填充。

好的,最后一个问题似乎已经排序。我在itemsCategories iteration中犯了一个错误。 :)

+0

我们可能需要查看控制器(或其他地方发生问题)。 “更新项目的类别”是什么意思? – 2015-02-11 10:43:00

+0

@caCtus感谢您的回复。我的意思是我可能想更新一个项目所属的类别。 – thitami 2015-02-11 10:47:55

+0

我已更新我的问题 – thitami 2015-02-11 10:53:27

回答

0

尝试删除级联坚持在类别实体...你应该做的只是在关系的所有方(你的情况)。

+1

感谢您的回复,@Stev。 我按照建议删除它,现在当我尝试保持相同的类别并向该项目添加一个新类别时,我得到相同的错误。 但是,当我删除预先存在的类别并将该项目添加到另一个类别中时,旧的不会被删除,而是会正确存储新的类别。 希望有所帮助。 – thitami 2015-02-11 12:40:01

+0

阅读此文章http://symfony.com/doc/current/cookbook/form/form_collections.html。 尤其是具有主义持久性的部分。 – Stev 2015-02-12 11:47:12

相关问题