基本上,我有两个表(文章和标签),我想用一些额外的属性建立多对多(一篇文章可以有很多标签,一个标签可以分配给很多文章)关系。我可以在 Doctrine2 中通过将其分解为两个单独的关系(一对多、多对一)和一个带有我的额外属性的关系表 ArticleTag 来编写它。
我的问题是我不知道我是否可以让 Doctrine2 也为我创建连接表实体。我的意思是当我打电话时:
$article = /* create new article, etc... */
$tag = /* create new tag, etc... */
$article->addTag($tag);
$em->persist($article);
$em->flush();
它确实在数据库中创建了文章和标签实体,但它不创建文章标签实体(换句话说,它不创建文章和标签之间的连接)。我可以自己创建它,但我宁愿依靠 Doctrine2。
当然,当我使用由 Doctrine2 生成的标准连接表时,它可以正常工作,但我需要那些额外的属性。
有谁知道或者我真的必须手动完成吗?
编辑:源代码
/**
* @ORM\Entity
*/
class Article {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\OneToMany(targetEntity="Tag", mappedBy="article", cascade={"persist"})
* @ORM\JoinTable(name="ArticleTag", joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")})
* )
*/
protected $tags;
...
}
/**
* @ORM\Entity
*/
class ArticleTag {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Article")
*/
private $article;
/**
* @ORM\ManyToOne(targetEntity="Tag")
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
*/
private $tag;
/**
* @ORM\Column(type="float")
*/
protected $priority = 0.5;
}
/**
* @ORM\Entity
*/
class Tag {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\Column(type="string", length=32)
*/
protected $name;
}