Doctrine2具有基于值的动态关系

时间:2016-06-30 12:14:59

标签: doctrine-orm symfony

我想要做的基本上是实体A,其字段类型与实体B或C相关,基于字段类型

的值

例如:产品如果类型饮料与 DrinkOptions 实体相关,但是如果类型食品与 FoodOptions 实体

在这种情况下,有没有优雅的解决方案可以正常工作? 这是我认为它会起作用的,但它不会......

  • 动态更改实体关系无济于事,因为它尚未加载,我看不到字段类型的值
  • 将不同的选项实体合并为一个,但它将是非常丑陋的图片,具有200多个属性..
  • 在配置中定义所有选项类型,然后使用loadClassMetadata动态创建映射,但不是那么漂亮它还需要实体A中所有选项类型的“虚拟”属性,getter和setter

2 个答案:

答案 0 :(得分:0)

可能的解决方案可能是使用单个表继承。可能不是最好的解决方案,但它可以满足您的特定需求。

<?php
namespace MyProject\Model;

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discriminator", type="string")
 * @DiscriminatorMap({"drink" = "DrinkOption", "food" = "FoodOption"})
 */
class Option
{
    // ...
}

/**
 * @Entity
 */
class FoodOption extends Option
{
    // ...
}

/**
 * @Entity
 */
class DrinkOption extends Option
{
    // ...
}

然后,您甚至可以通过更改&#34;鉴别器&#34;来切换类型。列。

答案 1 :(得分:0)

我认为最简单的方法是让多个产品实体具有继承性

Like Product(parent) - &gt; foodProduct(child)或DrinkProduct()。

通过这种方式,您可以将产品链接到普通的其他实体(如价格或品牌)以及食品,饮料,烟雾等的特定链接......

TargetSubVariant

如果它仍然不合适,你将不得不找到一些设计模式