リレーショナル データベース モデルでは、多対多の関係は、1 つのテーブルの複数の行を別のテーブルの複数の行に関連付けることができるシナリオを表します。ただし、この関係に追加の値が導入されると、それは新しいエンティティに変わります。このエンティティは、識別子 (接続されたエンティティへの 2 つの関係) と追加データを所有します。
多対多の関係を効果的にモデル化するにはDoctrine 2 には追加の値を持つ多くの関係があるため、関係を表す別のテーブルを作成することを検討してください。一般に「リンク テーブル」と呼ばれるこのテーブルには、両方の親テーブルとの関係を確立するために必要な列と、その関係に関連付けられた追加の属性が含まれます。
Doctrine 2 のコンテキストでは、このリンク テーブルを新しいエンティティとしてマッピングできます。製品と店舗に関するシナリオの例を考えてみましょう。
製品エンティティ:
<code class="php">namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="product") @ORM\Entity() */ class Product { /** @ORM\Id() @ORM\Column(type="integer") */ protected $id; /** ORM\Column(name="product_name", type="string", length=50, nullable=false) */ protected $name; /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="product") */ protected $stockProducts; }</code>
ストア エンティティ:
<code class="php">namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="store") @ORM\Entity() */ class Store { /** @ORM\Id() @ORM\Column(type="integer") */ protected $id; /** ORM\Column(name="store_name", type="string", length=50, nullable=false) */ protected $name; /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="store") */ protected $stockProducts; }</code>
株式エンティティ:
<code class="php">namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="stock") @ORM\Entity() */ class Stock { /** ORM\Column(type="integer") */ protected $amount; /** * @ORM\Id() * @ORM\ManyToOne(targetEntity="Entity\Store", inversedBy="stockProducts") * @ORM\JoinColumn(name="store_id", referencedColumnName="id", nullable=false) */ protected $store; /** * @ORM\Id() * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="stockProducts") * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) */ protected $product; }</code>
以上がリンク テーブルを使用して Doctrine 2 で追加の値を持つ多対多の関係をモデル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。