原则 2:使用附加字段管理多对多链接表
在原则 2 中,建模多对多关系通常涉及创建链接表来表示实体之间的连接。但是,可能会出现需要在链接表本身中存储附加信息的情况。这就提出了如何使用 Doctrine 访问和管理这些额外字段值的问题。
多对多关联的陷阱
传统上,多对-许多关系不被视为实体。这是因为它们通常用作连接器,而不具有任何独特的属性。但是,当您引入其他字段(例如“库存量”)时,链接表将成为具有自己的标识和值的实体。
多商店、多产品库存管理的原则实体
为了解决您的特定场景,您需要创建三个实体:产品、商店和库存。 Stock 实体旨在捕获产品和商店之间的关系,以及每种情况下的库存量。
定义关系
使用 Doctrine ORM 注释建立实体之间的关系。一对多关联应使用@OneToMany进行映射,而多对多关联则需要@ManyToMany注释。注意@Id和@Column注解分别定义了主键和实体字段。
Link Table中的附加字段
在Stock实体中,必须定义amount 字段作为具有相应 @Column 注释的属性。此附加字段将存储在链接表中。
示例实体定义
以下是产品、商店和库存的示例实体定义,其中包括所需的信息注释:
产品:
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\OneToMany(targetEntity="Entity\Stock", mappedBy="product") */ protected $stockProducts; }
存储e:
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\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\ManyToOne(targetEntity="Entity\Store", inversedBy="stockProducts") @ORM\JoinColumn(name="store_id", referencedColumnName="id", nullable=false) */ protected $store; /** @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="stockProducts") @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) */ protected $product; }
地址常见错误
如果在执行架构创建命令时遇到错误,例如缺少字段或不正确的表布局,请确保您的实体已正确注释。此外,请检查您是否已在数据库模式中定义了所有必要的列和关系。
通过遵循这些准则,您可以使用 Doctrine 2 成功管理具有附加字段的多对多链接表。这种方法允许您在关系本身中存储附加信息,为数据库模型提供更大的灵活性。
以上是如何管理教义 2 中带有额外字段的多对多关系?的详细内容。更多信息请关注PHP中文网其他相关文章!