リスティング広告代行の専門会社|Yahoo!プロモーション広告・Google AdWords完全対応|東京・大阪・名古屋

Doctrine @ManyToMany アソシエーション時に拡張フィールドを持たせる方法。


Doctrine の @ManyToMany アソシエーション時に、関連性以外の情報を持たせたい事があったのでメモ。

@ManyToMany は追加情報を持たせられない

@ManyToMany アソシエーション時に、中間テーブルとして使用するテーブルを指定しますが、
そのテーブルに対するエンティティを定義しても、スキーマ更新がうまくいきません。

@ManyToMany アソシエーションの中間テーブルとしてテーブルが作成されてしまうため、エンティティとして中間テーブルを定義してもテーブルが作成できないのです。

@OneToMany, @ManyToOne を使って擬似的に @ManyToManyを実現する。

この例ではエンティティ、タグ(Tag)とタグを付けられるモノ(Tagging)が多対多で存在しています。
長くなるので getter/setter は省略しています。

Tag(タグ)

[php]
/**
* Tag
*
* @ORM\Table()
* @ORM\Entity
*/
class Tag
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;

/**
* @ORM\OneToMany(targetEntity="TagReference", mappedBy="tag")
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
*/
private $tagReferences;
}[/php]

Tagging(タグを付けられるモノ)

[php]

/**
* Tagging
*
* @ORM\Table()
* @ORM\Entity
*/
class Tagging
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\OneToMany(targetEntity="TagReference", mappedBy="tagging")
* @ORM\JoinColumn(name="tagging_id", referencedColumnName="id")
*/
private $tagReferences;
}
[/php]

TagReferene(中間エンティティ)

[php]
/**
* TagReference
*
* @ORM\Table()
* @ORM\Entity
*/
class TagReference
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* アソシエーション以外の追加情報
* @ORM\Column(name="is_locked", type="boolean")
*/
private $isLocked;

/**
* @ORM\ManyToOne(targetEntity="Tag", inversedBy="tagReferences")
*/
private $tag;

/**
* @ORM\ManyToOne(targetEntity="Tagging", inversedBy="tagReferences")
*/
private $tagging;
}
[/php]

このように@ManyToManyアソシエーションを分解することで、アソシエーション以外の情報を TagReference#isLocked へ持たせることができます。



業界初のリスティング広告運用総合支援ツール Lisket(リスケット)

Facebookもチェック