2013-01-04 14 views
15

Symfony2 projemde iki ilişkili varlığım var: Kullanıcılar ve Sık Kullanılanlar. Çoktan çoğa ilişkileri var.Symfony2'de veritabanına birçok ilişkiyi kaydetme

Uygulamam aşağıdaki gibi çalışır: Benim Twig sayfamda 'Favorilerime Ekle' düğmesi olan birkaç öğe var. Düğmeye tıkladığınızda denetleyicim item_id öğesini Sık Kullanılanlar sütununa kaydeder. Ama o zaman ben öğeyi favorilerine ekleyen kullanıcı kaydetmek istiyorum ve burada benim uygulama başarısız olur.

Kullanıcılar ve Sık Kullanılanlar var, ancak Kullanıcılar ve Sık Kullanılanlar arasındaki birleşim sütunu boş kalır. Ayrıca herhangi bir hata almıyorum.

Varlık Kullanıcılar Orada yakın

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

Başarısız ...? Bir hata yaptın ya da hile yapmıyor mu? Bir hatayla karşılaşırsanız lütfen gönderin. – Pierrickouw

cevap

23

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

Varlık Sık

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

Benim denetleyicisi:

İşte benim kodudur. doktrin pek-çok ilişkileri için, hile yapmak gerekir yöntemleri

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

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

Bu çağrı hem eklemeniz gerekir. the docs'da bunu yapıyorlar, ama açıkça belirtme. Neden olmasın pek çok insanın neden buna katlandığından emin değilim (kendim dahil).

+0

"Bu ÇÖZÜMÜNÜ KABUL EDİYORUM, ANCAK BAŞARILIYORUM" yorumunu yaptı. Belki başka bir hata var ...Aslında, derneğin sahibi olmanız gerekir, böylece cevabınızın ilk satırı zorunlu değildir. – Pierrickouw

+0

Yaptığımda -> $ favorite-> addUser ($ user); $ user- >Favori (Favorilere ekle); $ em-> persist ($ favorite); $ em-> persist ($ user); $ em-> flush(); Ölümcül hata: bu hatayı alıyorum C olmayan bir nesne üzerinde üye işlev hareket() çağır: \ xampp \ htdocs \ Symfony13 hattında \ src \ Geo \ CityTroopersBundle \ Varlık \ Users.php Koduma baktım ve hiç aramadığım bir işleve atıfta bulunuyor. URL'yi oluşturabildiklerimden –

+0

, bağlantınızı dokümanlar için güncelledim – Dheeraj

0

gibi değil birçok ilişkiye bir kayıt eklemek yalnızca bir yönde yapılır ve ilişkiyi nasıl tanımladığınıza bağlıdır: ekleme ilişkinin ana işletmelerin kullanacağı yapılabilir, bu nedenle durumda kullanmalısınız:

$user->addFavorite($favorite); 
0

senin doğrultusunda:

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

name="favorite_id" 

parçası anlamına gelir Birleştir tablosundaki sütunlar, oysa birleştirme tablosundaki sütunlar,

, alışılmışın sadece "id" olduğu sık kullanılan tablodaki kimliği ifade eder. Denemelisiniz:

/** 
* @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;