我有2个实体 - 一个用户和一个标签。
这是我的用户:
<?php
namespace ProjectModel;
/**
* @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="ProjectModelTag", inversedBy="users")
* @JoinTable(name="user_tags")
**/
protected $tags;
/**
* Construct a new user.
*/
public function __construct() {
$this->tags = new DoctrineCommonCollectionsArrayCollection();
}
// 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 ProjectModel;
/**
* @Entity
* @Table(name="tags")
**/
class Tag implements JsonSerializable {
/** @Id @Column(type="integer") @GeneratedValue **/
protected $id;
/** @Column(type="string") **/
protected $tag;
/**
* @ManyToMany(targetEntity="ProjectModelUser", mappedBy="tags")
*/
protected $users;
public function __construct() {
$this->users = new DoctrineCommonCollectionsArrayCollection();
}
// 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());
我认为问题可能来自您的Manytomany关系。您使用
@ManyToMany(targetEntity="Tag", inversedBy="users")
虽然您应该有类似的东西(假设您正在使用Symfony 2):
@ManyToMany(targetEntity="AppBundleEntityTag")
另外,您使用inversedBy
,但没有mappedBy
,因此您的映射无效。
最后一个是一个细节,但是在标签类中命名属性"标签"不是最干净的。也许将其更改为"名称"。
在标签类中,您使用以下方式参考用户类:
/**
* @ManyToMany(targetEntity="BixModelUser", mappedBy="tags")
*/
" bix"是"项目"吗?除非这是您的问题中的错别字,否则请引起问题。
一侧应"拥有"协会,并在添加时负责设置反向关联。
<?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);
}
}