2011-08-12 10 views
50

Tôi có hai lớp mô hình PHP có tên là Category và Item. Danh mục có thể có nhiều mục và một mục có thể thuộc nhiều danh mục. Tôi đã tạo ra một mối quan hệ ManyToMany cho cả lớp:Symfony2-Doctrine: Mối quan hệ ManyToMany không được lưu vào cơ sở dữ liệu

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

    /** 
    * Add items 
    * 
    * @param Ako\StoreBundle\Entity\Item $items 
    */ 
    public function addItems(\Ako\StoreBundle\Entity\Item $items) 
    { 
     $this->items[] = $items; 
    } 

    /** 
    * Get items 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getItems() 
    { 
     return $this->items; 
    } 
} 

Và:

class Item 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Category", inversedBy="items", cascade={"persist"}) 
    * @ORM\JoinTable(name="item_category", 
    * joinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")}, 
    * inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")} 
    *) 
    */ 
    private $categories; 

    /** 
    * Add categories 
    * 
    * @param Ako\StoreBundle\Entity\Category $categories 
    */ 
    public function addCategories(\Ako\StoreBundle\Entity\Category $categories) 
    { 
     $this->categories[] = $categories; 
    } 

    /** 
    * Get categories 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getCategories() 
    { 
     return $this->categories; 
    } 
} 

Bây giờ trong điều khiển của tôi:

$em = $this->getDoctrine()->getEntityManager(); 

$item = $em->getRepository('AkoStoreBundle:Item')->find($item_id); 
$category = $em->getRepository('AkoStoreBundle:Category')->find($category_id); 

$category->addItems($item); 

$em->flush(); 
// Render the same page again. 

Trong trang này, tôi hiển thị danh sách tất cả các mục trong một trường chọn. Người dùng có thể chọn một mục và thêm nó vào danh mục.

Danh sách các mục thuộc về danh mục được hiển thị bên dưới biểu mẫu.

Khi tôi gửi biểu mẫu, mục đã chọn sẽ được thêm vào danh sách mục danh mục và được hiển thị bên dưới, nhưng nó không được lưu trữ trong cơ sở dữ liệu và nếu làm mới trang, nó sẽ biến mất.

Có ai có thể giúp tôi với điều này không? Cảm ơn trước.

+0

Trên bài giúp tôi rất nhiều để lập bản đồ Nhiều người đến Nhiều bản đồ trong Entity. Có liên kết tài liệu tốt (đầy đủ) nào hiển thị tất cả các loại ánh xạ cơ sở dữ liệu (ánh xạ thực thể) không? – Kiran

Trả lời

83

Mục Danh mục của bạn là inverse side của mối quan hệ.

Hãy thử thay đổi addItems trông như thế này:

public function addItem(\Ako\StoreBundle\Entity\Item $item) 
    { 
     $item->addCategory($this); 
     $this->items[] = $item; 
    } 

Lưu ý rằng tôi đã thay đổi tên số nhiều của bạn để số ít, kể từ khi bạn đang làm việc với các đơn vị duy nhất, không bộ sưu tập.

+2

http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#picking-owning-and-inverse-side – ziiweb

+15

Đã cho tôi một số giờ điều tra, nhưng khi điều này xảy ra trong biểu mẫu, bạn cũng phải đặt 'by_reference '=> false' trên các trường biểu mẫu tương ứng. Nếu không, các phương thức add * và remove * sẽ không bao giờ được gọi. – spackmat

+0

Và không làm như tôi đã làm: không thêm phương pháp này trên cả hai bên hoặc các thực thể yout sẽ lặp lại cho đến khi máy chủ của bạn khởi động lại ... – Leogout

2

tôi đã có vấn đề tương tự ... Tôi nghĩ rằng bạn quên

$category->addItems($item); 
$em->persist($category); 
$em->flush(); 
+11

Có không có 'persist()' cần thiết vì cả hai thực thể đã được quản lý –