php - Doctrine 2 和带有额外字段的多对多链接表

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

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

我用过exportmwb为这个简单的例子生成两个实体商店和产品,两者都显示在下面。

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

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

因此,从逻辑上讲,我尝试将我的数据库模型更改为将库存作为一个单独的表,其中包含与商店和产品的关系。我还重写了字段名,以便能够将其排除为问题的根源:

然后我发现我仍然没有得到 Stock 实体...而且数据库本身没有“金额”字段。

我真的需要能够将这些商店和产品绑定(bind)在一个库存表中(除其他外)......所以只在产品本身上添加库存不是一种选择。

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

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

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

我在这里做错了什么?

最佳答案

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

这也是多对多关联如此罕见的原因:您倾向于在其中存储其他属性,例如 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;
}

https://stackoverflow.com/questions/15616157/

相关文章:

php - 将秒转换为天、小时、分钟和秒

php - Ubuntu 在终端输入 'php' 显示很多错误

php - Apache 正在下载 php 文件而不是显示它们

php - PHP中的全局变量被认为是不好的做法吗?如果是这样,为什么?

java - 正则表达式正好 n 或 m 次

php - PHP 中 JavaScript 的 encodeURIcomponent 等价物是什么

php - 如何在函数调用中跳过可选参数?

php - GD vs ImageMagick vs Gmagick for jpg?

php - 如何使用 PHP 检查远程文件是否存在?

php - 解释 $CI =& get_instance();