基本上,我有两个表格(文章和标签),我想使多对多(一个文章可以有很多标签,一个标签可以分配给很多文章)与一些额外的属性。 我可以在Doctrine2中通过将它分成两个单独的关系(一对多,多对一)和一个关系表ArticleTag以及我的额外属性来编写它。Doctrine2 - 保存自定义连接关系表
我的问题是,我不知道我是否可以让Doctrine2为我创建连接表实体。我的意思是,当我打电话:
$article = /* create new article, etc... */
$tag = /* create new tag, etc... */
$article->addTag($tag);
$em->persist($article);
$em->flush();
它DOES在数据库中创建两个条和标签实体,但它DOES NOT创建ArticleTag实体(换句话说,它不会创建之间的连接文章和标签)。我可以自己创建它,但我宁愿依靠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;
}
我明白ArticleTag不是关系表,因为我的额外'优先'列,但我很惊讶,Doctrine2不能处理这个实体的方式与自动生成相同。 – martin
我在回答同样的问题。然而,科林的解决方案并不完美,因为它只适用于单向关系。 如果您管理文章中的标签,但不管理标签中的文章,那没关系。只要您希望能够在标记实体中使用“addArticle()”方法,就必须处理两个相同的ArticleTag实体。的确,“addTag()”和“addArticle()”都会创建一个具有相同值的ArticleTag。 这也只是一个部分解决方案,因为它缺乏持久性和移除的管理。 – Ninj
@Ninj我的解决方案可以相对容易地修改以支持删除以及双向关系。这个问题没有被要求。 –