开发者社区> 问答> 正文

教义2和带有多个字段的多对多链接表?mysql

(很抱歉,我的问题不连贯:撰写本文时,我试图回答一些问题,但这是:)

我正在尝试创建一个在链接表内部具有多对多关系的数据库模型,但是每个链接也有一个值,在这种情况下是库存表。(这是我遇到的更多问题的基本示例,但我认为在继续之前,我将对此进行测试)。

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

对于这个简单的示例,我已经使用exportmwb生成了两个实体商店和产品,两者均显示在下面。

但是,现在的问题是,我无法弄清楚如何使用Doctrine访问stock.amount值(带符号int,因为它可以是负数)。另外,当我尝试使用主义的orm:schema-tool:create函数创建表时

从HeidiSQL中看到的数据库布局

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

因此,从逻辑上讲,我尝试更改数据库模型,以将库存作为具有存储和产品关系的独立表。我还重写了字段名,只是为了能够将其排除在问题之外:

更改数据库布局

然后我发现我仍然没有股票实体……并且数据库本身没有“金额”字段。

我真的需要能够将这些商店和产品绑定到一个库存表中(除其他外)……因此,仅添加产品本身的库存是不可行的。

root@hdev:/var/www/test/library# php doctrine.php orm:info Found 2 mapped entities: [OK] Entity\Product [OK] Entity\Store 而且,当我创建数据库时,它仍然没有在库存表中提供正确的字段:

从HeidiSQL中看到的数据库布局

因此,在这里查找一些内容后,我发现多对多连接不是实体,因此不能具有值。因此,我尝试将其更改为具有其他关系的单独表,但是仍然无法正常工作。

我在这里做错了什么?

展开
收起
保持可爱mmm 2020-05-17 09:25:09 466 0
1 条回答
写回答
取消 提交回答
  • 具有附加值的“多对多”关联不是“多对多”,而是确实是一个新实体,因为它现在具有标识符(与连接的实体的两个关系)和值。

    这也是为什么许多-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;
    

    } 商店:

    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;
    

    }来源:stack overflow

    2020-05-17 09:31:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像