基本的に、私は2つのテーブル(記事とタグ)を持っており、いくつかの追加の属性と多対多(1つの記事に多くのタグを含めることができ、1つのタグを多くの記事に割り当てることができます)の関係を作りたいです。これをDoctrine2で書くには、2つの別々のリレーション(1対多、多対1)と、追加の属性を持つ1つのリレーションテーブルArticleTagに分割します。
私の問題は、Doctrine2を作成して結合テーブルエンティティも作成できるかどうかわからないことです。私が意味するのは、私が電話するときです:
$article = /* create new article, etc... */
$tag = /* create new tag, etc... */
$article->addTag($tag);
$em->persist($article);
$em->flush();
データベースにArticleエンティティとTagエンティティの両方を作成しますが、ArticleTagエンティティは作成しません(つまり、ArticleとTagの間の接続は作成しません)。自分で作成することもできますが、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;
}