2015-05-13 40 views
0

我有2個實體 - 用戶和標籤。不能得到教條2多對多的關係去工作

這是我的用戶:

<?php 
namespace Project\Model; 
/** 
* @Entity 
* @Table(name="users") 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"user" = "User", "client" = "Client", "staff" = "Staff"}) 
**/ 
class User implements \JsonSerializable { 
    /** @Id @Column(type="integer") @GeneratedValue **/ 
    protected $id; 

    /** @Column(type="string", name="first_name") **/ 
    protected $firstName; 

    /** 
    * @ManyToMany(targetEntity="Project\Model\Tag", inversedBy="users") 
    * @JoinTable(name="user_tags") 
    **/ 
    protected $tags; 

    /** 
    * Construct a new user. 
    */ 
    public function __construct() { 
    $this->tags = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    // Getters 

    public function getId() { 
    return $this->id; 
    } 

    public function getFirstName() { 
    return $this->firstName; 
    } 

    public function getTags() { 
    return $this->tags; 
    } 

    // Setters 

    public function setFirstName($firstName) { 
    $this->firstName = $firstName; 
    } 

    /** 
    * Add a tag to a user. 
    * @param Tag 
    */ 
    public function addTag(Tag $tag) { 
    $tag->addUser($this); 
    $this->tags[] = $tag; 
    } 
} 

這是我的標籤:

<?php 
namespace Project\Model; 
/** 
* @Entity 
* @Table(name="tags") 
**/ 
class Tag implements \JsonSerializable { 
    /** @Id @Column(type="integer") @GeneratedValue **/ 
    protected $id; 

    /** @Column(type="string") **/ 
    protected $tag; 

    /** 
    * @ManyToMany(targetEntity="Project\Model\User", mappedBy="tags") 
    */ 
    protected $users; 

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

    // Getters 

    public function getId() { 
    return $this->id; 
    } 

    public function getTag() { 
    return $this->tag; 
    } 

    // Setters 

    public function setTag($tag) { 
    $this->tag = $tag; 
    } 

    public function addUser(User $user) { 
    $this->users[] = $user; 
    } 
} 

如果我創建一個新的標籤,新的用戶,標籤添加到用戶,然後調用getTag ()方法,它什麼都不返回 - 任何人都可以幫我解決我出錯的地方嗎?

$tag = new Tag(); 
$tag->setTag('Foo'); 
$entityManager->persist($tag); 

$user = new User(); 
$user->addTag($tag); 
$entityManager->persist($user); 
$entityManger->flush(); 

var_dump($user->getTags()); 

回答

0

我認爲問題可能來自您的ManyToMany關係。您可以使用

@ManyToMany(targetEntity="Tag", inversedBy="users") 

,而你應該有這樣的事情(假設你使用當然的Symfony 2):

@ManyToMany(targetEntity="AppBundle\Entity\Tag") 

此外,您使用的是inversedBy但沒有mappedBy,所以你的映射是無效的。

而這最後一個更詳細的內容,但在Tag類中命名屬性「標記」不是最乾淨的。也許把它改成「名字」。

+0

我已更新我的問題以包含我的命名空間。另外我沒有使用Symfony。我應該在哪裏獲得mappedBy? – JeremyKirkham

+0

要麼刪除你的「inverdedBy」映射,並且你的實體之間有一個單向關係,要麼向你的標記實體添加一個$ users屬性,註釋爲:@ManyToMany(targetEntity =「Project \ Model \ User」,inversedBy = 「tags」)' 然後它變成雙向的。 –

+0

我與第二個選項,但它仍然沒有工作。另外根據教義文檔,標記實體註釋應該被映射,而不是反向。我試過了,但也沒有奏效。 – JeremyKirkham

0

在你的標籤類,您引用使用用戶等級:

/** 
* @ManyToMany(targetEntity="Bix\Model\User", mappedBy="tags") 
*/ 

應該「比克斯」是「項目」?除非這是你的問題中的錯字,否則會導致問題。

一方應該「擁有」該關聯並負責在添加時設置反向關聯。

<?php 

// Assuming that the User is the "owning side". 

class User { 

    // Mappings as you have them, minus the "Bix" namespace thing. 

    public function getTags() 
    { 
     return $this->tags; 
    } 

    public function addTag(Tag $tag) 
    { 
     $tag->addUser($this); 
     $this->tags->add($tag); 
    } 

    public function removeTag(Tag $tag) 
    { 
     $tag->removeUser($this); 
     $this->tags->removeElement($tag); 
    } 
} 

class Tag { 

    // Mappings as you have them, minus the "Bix" namespace thing. 

    public function getUsers() 
    { 
     return $this->users; 
    } 

    public function addUser(User $user) 
    { 
     $this->users->add($user); 
    } 

    public function removeUser(User $user) 
    { 
     $this->users->removeElement($user); 
    } 
}