带有额外字段的Doctrine 2和Many-to-many链接表

Hen*_*gen 84 php mysql doctrine-orm

(对不起我的语无伦次问题:我在撰写这篇文章时试图回答一些问题,但这里是:)

我正在尝试在链接表中创建一个具有多对多关系的数据库模型,但每个链接也有一个值,在这种情况下是一个库存表.(这是我遇到的更多问题的一个基本示例,但我想我会在继续之前用它测试它).

基本多商店,多产品存储系统的数据库模型

我已经使用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
Run Code Online (Sandbox Code Playgroud)

当我创建数据库时,它仍然没有在stock表中给我正确的字段:

从HeidiSQL看到的数据库布局

所以,在这里查看一些内容,我发现多对多连接不是实体,因此不能有值.所以我尝试将它更改为一个与其他表有关系的单独表,但它仍然无效.

我在这做错了什么?

Ocr*_*ius 137

与其他值的多对多关联不是多对多,但实际上是一个新实体,因为它现在具有标识符(与连接实体的两个关系)和值.

这也是为什么许多-to-many关联是如此罕见:你会存储在他们的附加属性,如sorting,amount等.

你可能需要的是跟随的东西(我将两个关系都设为双向,考虑使其中至少有一个是单向的):

产品:

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;
}
Run Code Online (Sandbox Code Playgroud)

商店:

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;
}
Run Code Online (Sandbox Code Playgroud)

股票:

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;
}
Run Code Online (Sandbox Code Playgroud)


tim*_*dev 17

Doctrine处理多对多关系就好了.

您遇到的问题是您不需要简单的ManyToMany关联,因为关联不能有"额外"数据.

您的中间(库存)表,因为它包含的不仅仅是product_id和store_id,它需要自己的实体来建模额外的数据.

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

  • 产品
  • 库存水平
  • 商店

和两个协会:

  • 产品oneToMany StockLevel
  • 存储oneToMany StockLevel