Menjelaskan Pertanyaan
Dalam soalan asal, pengguna mendapatkan panduan untuk mencipta perhubungan banyak-ke-banyak dalam jadual pautan yang mengandungi medan tambahan (jumlah stok). Cabaran timbul apabila mengakses nilai jumlah stok menggunakan Doktrin dan menjana struktur jadual pangkalan data.
Menangani Isu
Isu ini berpunca daripada andaian bahawa ramai-kepada -banyak hubungan dengan nilai tambahan boleh dianggap sedemikian. Walau bagaimanapun, perhubungan banyak-ke-banyak dengan nilai tambahan menjadi entiti baharu dengan pengecam dan nilai.
Penyelesaian
Penyelesaian melibatkan mewujudkan entiti berasingan yang dipanggil Saham dengan lajur berikut:
Ini membenarkan sistem memodelkan perhubungan banyak-ke-banyak dengan tepat, memberikan akses kepada nilai jumlah stok menggunakan Doktrin.
Entiti Kemas Kini
Di bawah ialah entiti yang diselaraskan definisi:
Produk:
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; }
Kedai:
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; }
Stok:
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; }
Pangkalan data Struktur
Perubahan ini menghasilkan struktur pangkalan data yang ditunjukkan di bawah:
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) );
Atas ialah kandungan terperinci Bagaimana Mengendalikan Hubungan Banyak-ke-Banyak dengan Medan Tambahan dalam Doktrin 2?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!