ホームページ > データベース > mysql チュートリアル > Doctrine 2 で追加フィールドを使用した多対多の関係を処理するにはどうすればよいですか?

Doctrine 2 で追加フィールドを使用した多対多の関係を処理するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-22 01:55:11
オリジナル
772 人が閲覧しました

How to Handle Many-to-Many Relationships with Extra Fields in Doctrine 2?

Doctrine 2 と追加フィールドを含む多対多リンク テーブル: 明確化

クエリの明確化

元の質問では、ユーザーは追加のフィールドを含むリンク テーブル内で多対多のリレーションシップを作成するためのガイダンスを求めていました。 (在庫量)。この課題は、Doctrine を使用して在庫量の値にアクセスし、データベースのテーブル構造を生成するときに発生しました。

問題への対処

この問題は、多対- 追加の値との多くの関係は、そのように扱うことができます。ただし、追加の値を持つ多対多の関係は、識別子と値を持つ新しいエンティティになります。

解決策

この解決策には、Stock という別個のエンティティの作成が含まれます。次の列:

  • 金額 (在庫を保存するため) value)
  • Product エンティティと Store エンティティの両方との関係

これにより、システムは多対多の関係を正確にモデル化し、Doctrine を使用して在庫量の値にアクセスできるようになりました。

更新されたエンティティ

以下は調整されたものです 実在物定義:

製品:

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;
}
ログイン後にコピー

Sto re:

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;
}
ログイン後にコピー

在庫:

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;
}
ログイン後にコピー

データベース構造

この変更により、データベース構造は以下に示すようになりました:

CREATE TABLE product (
  id INT NOT NULL,
  product_name VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE store (
  id INT NOT NULL,
  store_name VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE stock (
  amount INT NOT NULL,
  store_id INT NOT NULL,
  product_id INT NOT NULL,
  PRIMARY KEY (store_id, product_id),
  FOREIGN KEY (store_id) REFERENCES store (id),
  FOREIGN KEY (product_id) REFERENCES product (id)
);
ログイン後にコピー

以上がDoctrine 2 で追加フィールドを使用した多対多の関係を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート