Doctrine 2和多对多链接表与一个额外的领域

(对不起我的不连贯的问题:我正在写这篇文章,试图回答一些问题,但在这里:)

我试图在链接表内创build一个具有多对多关系的数据库模型,但是每个链接也有一个值,在这种情况下是一个库存表。 (这是我遇到的更多问题的一个基本例子,但是我认为我会在继续之前testing它)。

基本的多店,多产品仓库管理系统的数据库模型

我已经使用exportmwb为这个简单的例子生成了两个Entities Store和Product,两者都显示在下面。

但是,现在的问题是,我不知道如何使用Doctrine来访问stock.amount值(signed int,因为它可以是负数)。 此外,当我尝试使用教义的orm:schema-tool:create函数创build表

从HeidiSQL中看到的数据库布局

这只产生了两个实体和三个表,一个作为没有值的链接表和两个数据表,因为多对多关系本身不是实体,所以我只能将Product和Store作为一个实体。

所以,从逻辑上讲,我试着改变我的数据库模型,把股票作为一个独立的表格,存储和产品关系。 我还重写了字段名称,以便能够排除这个问题的来源:

改变数据库布局

然后,我发现我还没有得到一个股票实体…和数据库本身没有“金额”字段。

我真的需要能够将这些商店和产品捆绑在一个库存表(等等)中…所以只要在产品本身添加库存不是一个选项。

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

而当我创build数据库,它仍然没有给我正确的股票表中的字段:

从HeidiSQL中看到的数据库布局

所以,在这里查找一些东西,我发现多对多的连接不是实体,因此不能有价值。 所以我试着把它改成与其他人有关系的单独的表格,但是它仍然不起作用。

我在这里做错了什么?

与附加值的多对多关联不是多对多关系,而是确实是一个新的实体,因为它现在有一个标识符(与关联实体的关系)和值。

这也是多对多协会非常罕见的原因:您往往会在其中存储额外的属性,如sortingamount等。

你可能需要的是像下面这样的东西(我把两个关系都做成双向的,至less考虑一个是单向的):

产品:

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

学说处理多对多的关系就好了。

你遇到的问题是你不需要一个简单的ManyToMany关联,因为关联不能有“额外的”数据。

您的中间(股票)表,因为它包含多于product_id和store_id,需要它自己的实体来模拟额外的数据。

所以你真的需要三类实体:

  • 产品
  • StockLevel
  • 商店

和两个协会:

  • 产品oneToMany StockLevel
  • 存储一个多个StockLevel