我可以使用相同的 table 来表示 Symfony 中的不同实体吗?
Can I use the same table to represent different Entities in Symfony?
我正在将旧的 PHP 项目迁移到 Symfony。我正在尝试基于我 无法更改 的现有数据库模式创建实体。我遇到了一个问题:
有一个 table 代表两个不同的实体。基本上,有一个布尔值(tinyint(1)
),如果布尔值是假的,那么 table 的行代表一个购物车。如果布尔值为真,则该行代表一个订单。
Doctrine 是否可以区分这些实体并相应地获取这些实体?我愿意实施的解决方案是创建多个实体并覆盖这些实体存储库中的 find()
和 findAll()
方法。还有其他方法可以实现吗?
这就是所谓的学说Inheritance Mapping。
因此您将拥有一个 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 {...}
这段代码可能有一些错误,我没有测试,但应该没问题。
我正在将旧的 PHP 项目迁移到 Symfony。我正在尝试基于我 无法更改 的现有数据库模式创建实体。我遇到了一个问题:
有一个 table 代表两个不同的实体。基本上,有一个布尔值(tinyint(1)
),如果布尔值是假的,那么 table 的行代表一个购物车。如果布尔值为真,则该行代表一个订单。
Doctrine 是否可以区分这些实体并相应地获取这些实体?我愿意实施的解决方案是创建多个实体并覆盖这些实体存储库中的 find()
和 findAll()
方法。还有其他方法可以实现吗?
这就是所谓的学说Inheritance Mapping。
因此您将拥有一个 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 {...}
这段代码可能有一些错误,我没有测试,但应该没问题。