簡體   English   中英

帶有額外字段的Doctrine 2和Many-to-many鏈接表

[英]Doctrine 2 and Many-to-many link table with an extra field

(對不起我的語無倫次問題:我在撰寫這篇文章時試圖回答一些問題,但這里是:)

我正在嘗試在鏈接表中創建一個具有多對多關系的數據庫模型,但每個鏈接也有一個值,在這種情況下是一個庫存表。 (這是我遇到的更多問題的一個基本示例,但我認為在繼續之前我只是用它來測試它)。

基本多商店,多產品存儲系統的數據庫模型

我已經使用exportmwb為這個簡單的例子生成了兩個Entities Store和Product,兩者都顯示在下面。

但是,現在的問題是我無法弄清楚如何使用Doctrine訪問stock.amount值(signed int,因為它可能是負數)。 此外,當我嘗試使用doctrine的orm創建表時:schema-tool:create function

從HeidiSQL看到的數據庫布局

這只產生了兩個實體和三個表,一個是沒有值的鏈接表和兩個數據表,因為多對多關系本身不是實體,因此我只能將Product和Store作為實體。

所以,從邏輯上講,我嘗試更改我的數據庫模型,將庫存作為一個單獨的表,與商店和產品的關系。 我還重寫了字段名,只是為了能夠將其排除為問題的根源:

更改數據庫布局

然后我發現我仍然沒有得到Stock實體......而且數據庫本身沒有'amount'字段。

我真的需要能夠將這些商店和產品捆綁在一個庫存表(以及其他東西)中......所以只是在產品本身上添加庫存不是一種選擇。

root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK]   Entity\Product
[OK]   Entity\Store

當我創建數據庫時,它仍然沒有在stock表中給我正確的字段:

從HeidiSQL看到的數據庫布局

所以,在這里查看一些內容,我發現多對多連接不是實體,因此不能有值。 所以我嘗試將它更改為一個與其他表有關系的單獨表,但它仍然無效。

我在這做錯了什么?

與其他值的多對多關聯不是多對多,但實際上是一個新實體,因為它現在具有標識符(與連接實體的兩個關系)和值。

這也是多對多關聯如此罕見的原因:您傾向於在其中存儲其他屬性,例如sortingamount等。

你可能需要的是跟隨的東西(我將兩個關系都設為雙向,考慮使其中至少有一個是單向的):

產品:

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;
}

商店:

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;
}

Doctrine處理多對多關系就好了。

您遇到的問題是您不需要簡單的ManyToMany關聯,因為關聯不能有“額外”數據。

您的中間(庫存)表,因為它包含的不僅僅是product_id和store_id,它需要自己的實體來建模額外的數據。

所以你真的想要三類實體:

  • 產品
  • 庫存水平
  • 商店

和兩個協會:

  • 產品oneToMany StockLevel
  • 存儲oneToMany StockLevel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM