2013-01-04 35 views
15

Trong dự án Symfony2 của tôi, tôi có hai thực thể liên quan: Người dùng và Yêu thích. Họ có mối quan hệ nhiều-nhiều.Lưu nhiều mối quan hệ vào cơ sở dữ liệu trong Symfony2

Ứng dụng của tôi hoạt động như sau: Trong trang Twig của tôi, tôi có một vài mục có nút 'Thêm vào mục yêu thích'. Khi bạn nhấn vào nút điều khiển của tôi lưu item_id trong cột Favorites. Nhưng sau đó tôi muốn lưu người dùng đã thêm mục vào mục yêu thích của mình và tại đây ứng dụng của tôi không thành công.

Người dùng và người yêu thích tồn tại nhưng phần kết hợp giữa Người dùng và Ưa thích vẫn trống. Tôi cũng không nhận được bất kỳ loại lỗi nào.

Đây là mã của tôi:

Người dùng Entity

class Users implements AdvancedUserInterface 
{ 
    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"}) 
    * @ORM\JoinTable(name="user_has_favorite", 
    * joinColumns={ 
    *  @ORM\JoinColumn(name="user_id", referencedColumnName="user_id") 
    * }, 
    * inverseJoinColumns={ 
    *  @ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id") 
    * } 
    *) 
    */ 
    private $favorite; 

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

    public function addFavorite(\Geo\CityTroopersBundle\Entity\Favorites $favorite) 
    { 
     $this->favorite[] = $favorite; 

     return $this; 
    } 
... 

Entity Favorites

class Favorites 
{ 

    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="Users", mappedBy="favorite", cascade={"persist"}) 
    */ 
    private $user; 

    public function __construct() 
    { 
     $this->user = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
    public function addUser(\Geo\CityTroopersBundle\Entity\Users $user) 
    { 
     $this->user[] = $user;  
     return $this; 
    } 

điều khiển của tôi

public function showNewsAction() 
    { 
     $request = $this->get('request');  
     $itemId=$request->request->get('itemId'); 
     if($itemId != NULL) 
     { 
     //MAKE NEW FAVORITE AND ADD TO DATABASE LINKED WITH ITEM 
     $favorite = new Favorites(); 
     $favorite->setItemId($itemId); 

     //LINK FAVORITE ID WITH USER ID IN JOINCOLUMN 
     $userId = 6; 
     $em = $this->getDoctrine()->getEntityManager(); 

     $user = $em->getRepository('GeoCityTroopersBundle:Users')->find($userId); 

     $favorite->addUser($user); 
     $em->persist($favorite); 

     //I TRIED THIS TOO, BUT IT FAILED 
     /*$user->addFavorite($favorite); 
     $em->persist($user);*/ 

     $em->flush(); 
+0

Không thành công ...? Bạn đã nhận được một lỗi hoặc nó không làm các trick? Nếu bạn có lỗi, hãy đăng nó. – Pierrickouw

Trả lời

23

Bạn đang ở rất gần đó. Đối với các mối quan hệ nhiều-với-nhiều học thuyết, bạn cần phải gọi cả hai phương thức thêm

$favorite->addUser($user); 
$user->addFavorite($favorite); 

$em->persist($favorite); 
$em->persist($user); 
$em->flush(); 

Điều này nên thực hiện thủ thuật. Trong the docs, họ thực hiện việc này, nhưng đừng đề cập đến điều đó quá rõ ràng. Bạn không chắc chắn lý do tại sao vì rất nhiều người chạy vào điều này (bao gồm cả tôi).

+0

Nó cho biết trong bình luận "Tôi đã hiểu điều này quá, NHƯNG nó FAILED". Có thể có một lỗi khác ...Trên thực tế, bạn chỉ cần cập nhật phần sở hữu của liên kết để dòng đầu tiên của câu trả lời của bạn không bắt buộc. – Pierrickouw

+0

Khi tôi làm -> $ yêu thích-> addUser ($ user); $ user-> addFavorite ($ yêu thích); $ em-> persist ($ yêu thích); $ em-> persist ($ user); $ em-> flush(); tôi nhận được lỗi này: Fatal error: Gọi đến một di chuyển chức năng thành viên() trên một tổ chức phi-đối tượng trong C: \ xampp \ htdocs \ Symfony13 \ src \ Geo \ CityTroopersBundle \ Entity \ Users.php trên đường dây Tôi đã xem Mã của mình và nó đề cập đến một chức năng mà tôi không hề gọi. –

+0

từ những gì tôi có thể tạo thành url, tôi đã cập nhật liên kết của bạn với tài liệu – Dheeraj

0

Giống như chỉ định bởi Cedric , thêm một bản ghi cho một mối quan hệ nhiều đến nhiều chỉ được thực hiện theo một hướng và nó phụ thuộc vào cách bạn đã xác định quan hệ: thêm có thể được thực hiện chỉ bởi các công ty mẹ của các mối quan hệ, vì vậy trong trường hợp của bạn, bạn phải sử dụng:

$user->addFavorite($favorite); 
0

Phù hợp của bạn:

@ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id") 

Các

name="favorite_id" 

phần đề cập đến các cột trong bảng tham gia, trong khi

referencedColumnName="favorite_id" 

dùng để chỉ id trong bảng yêu thích mà thông thường chỉ đơn giản là "id". Bạn nên thử:

/** 
* @var \Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"}) 
* @ORM\JoinTable(name="user_has_favorite", 
* joinColumns={ 
*  @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="favorite_id", referencedColumnName="id") 
* } 
*) 
*/ 
private $favorite; 
Các vấn đề liên quan