2013-01-04 17 views
15

W moim projekcie Symfony2 mam dwie powiązane jednostki: Użytkownicy i Ulubione. Mają związek wiele do wielu.Zapisywanie wielu do wielu relacji z bazą danych w Symfony2

Moja aplikacja działa w następujący sposób: Na mojej stronie z gałązkami mam kilka przedmiotów z przyciskiem "Dodaj do ulubionych". Po kliknięciu przycisku mój kontroler zapisuje item_id w kolumnie Ulubione. Ale potem chcę zapisać użytkownika, który dodał pozycję do swoich ulubionych i tutaj moja aplikacja nie działa.

Użytkownik i ulubione istnieją, ale joincolumn między użytkownikami i ulubionymi pozostaje pusty. Nie otrzymuję również żadnych błędów.

Oto mój kod:

Entity Użytkownicy

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 Ulubione

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; 
    } 

Mój kontroler

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

Nie udało się ...? Masz błąd lub nie działa? Jeśli masz błąd, opublikuj go. – Pierrickouw

Odpowiedz

23

byłaś blisko tam. W przypadku doktryny wiele-do-wielu relacji, musisz wywołać obie metody dodawania, co powinno wystarczyć. W the docs robią to, ale nie wspominajcie o tym zbyt otwarcie. Nie jestem pewien, dlaczego tak się dzieje, ponieważ wiele osób się w to zagłębia (włącznie z mną).

+0

Powiedział w komentarzu: "SPRÓBOWAŁEM TO ZBYT, ALE NIE SPEŁNIONE". Może jest inny błąd ...W rzeczywistości wystarczy zaktualizować stronę powiązania, aby pierwsza linia odpowiedzi nie była obowiązkowa. – Pierrickouw

+0

Kiedy to zrobię -> $ ulubiony-> addUser ($ użytkownik); $ user-> addFavorite ($ favorite); $ em-> persist ($ favorite); $ em-> persist ($ user); $ em-> flush(); otrzymuję ten błąd: Błąd krytyczny: Zadzwoń do ruchu funkcji członka() w sposób wolny od obiektu w C: \ xampp \ htdocs \ Symfony13 \ src \ Geo \ CityTroopersBundle \ Entity \ Users.php on line Zajrzałem do mojego Kodeksu i dotyczy ono funkcji, do której w ogóle nie dzwonię. –

+0

z tego, co mogłem odczytać z adresu URL, zaktualizowałem Twój link do dokumentów – Dheeraj

0

Jak wskazano przez Cedrica dodanie rekordu dla wielu do wielu relacji odbywa się tylko w jednym kierunku i zależy od tego, jak zdefiniowałeś relację: dodawanie może być dokonana jedynie przez podmiot dominujący w stosunku, tak w twoim przypadku należy użyć:

$user->addFavorite($favorite); 
0

W linii:

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

name="favorite_id" 

części odnosi się do kolumny w tabeli sprzężenia, natomiast odnosi się do id w ulubionej tabeli, która zwykle jest po prostu "id". Powinieneś spróbować:

/** 
* @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; 
Powiązane problemy