首页 > 解决方案 > 我可以在 Symfony 中使用同一张表来表示不同的实体吗?

问题描述

我正在将一个旧的 PHP 项目迁移到 Symfony。我正在尝试根据无法更改的现有数据库架构创建实体。我面临一个问题:

有一个代表两个不同实体的表。基本上,有一个布尔值 (a tinyint(1)),如果布尔值是假的,那么表格的行代表一个购物车。如果布尔值为真,则该行表示订单。

Doctrine 是否可以区分这些实体并相应地获取这些实体?我愿意实施的解决方案是创建多个实体并覆盖这些实体存储库中的find()findAll()方法。还有其他方法可以实现吗?

标签: phpdoctrine

解决方案


这就是学说所说的继承映射

因此,您将拥有一个Cart实体和一个Order实体扩展它。

/**
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="App\Repository\CartRepository")
 * @ORM\InheritanceType(value="SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="is_order", columnDefinition="BOOL DEFAULT FALSE")
 * @ORM\DiscriminatorMap(
 *     value={
 *      CART::IS_CART=Cart::class,
 *      CART::IS_ORDER=Order::class
 *     }
 * )
 */
class Cart {
   const IS_CART = FALSE;
   const IS_ORDER = TRUE;
   ... // Entity field, getters, setters, functions...
}

然后是你的Order实体。

/**
 * @ORM\Entity(repositoryClass=OrderRepository::class)
 */
class Order extends Cart {...}

这段代码可能有一些错误,我没有测试它,但应该没问题。


推荐阅读