Doctrine orm Doctrine2具有基于值的动态关系

Doctrine orm Doctrine2具有基于值的动态关系,doctrine-orm,symfony,Doctrine Orm,Symfony,我想做的基本上是实体A,它有字段类型,根据字段类型的值与实体B或C关联 例如:产品如果类型饮料与饮用选项实体相关,但是如果类型食品与食品选项实体相关 在这种情况下,有什么优雅的解决方案可以很好地工作吗? 这是我认为它会起作用的,但它没有 动态更改实体A关系不会有帮助,因为它尚未加载,而且我看不到fieldtype 将不同的选项实体合并为一个,但这将是一张有200多个属性的非常难看的图片 在配置中定义所有选项类型,然后使用loadClassMetadata动态创建映射,但这并不漂亮,它还需要一个

我想做的基本上是实体A,它有字段类型,根据字段类型的值与实体B或C关联

例如:产品如果类型饮料与饮用选项实体相关,但是如果类型食品与食品选项实体相关

在这种情况下,有什么优雅的解决方案可以很好地工作吗? 这是我认为它会起作用的,但它没有

  • 动态更改实体A关系不会有帮助,因为它尚未加载,而且我看不到fieldtype
  • 将不同的选项实体合并为一个,但这将是一张有200多个属性的非常难看的图片
  • 在配置中定义所有选项类型,然后使用loadClassMetadata动态创建映射,但这并不漂亮,它还需要一个“虚拟”属性,即实体a中所有选项类型的getter和setter

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

      <?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
      {
          // ...
      }
      

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

      <?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
      {
          // ...
      }
      

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

      与Product(父项)->foodProduct(子项)或DrinkProduct()类似

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

      Product
        id:
        type: food/drink/smoke etc..
        foodproduct: one to Many nullable: FoodProduct (it's actually one to zero/one but i find it more performant)
        drinkproduct: one to Many nullable: DrinkProduct 
        smokeproduct:one to Many nullable: SmokeProduct 
      
      
      FoodProduct:
        id:
        product_id (many to one to Product)
        options one to many to foodOptions
      

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

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

      与Product(父项)->foodProduct(子项)或DrinkProduct()类似

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

      Product
        id:
        type: food/drink/smoke etc..
        foodproduct: one to Many nullable: FoodProduct (it's actually one to zero/one but i find it more performant)
        drinkproduct: one to Many nullable: DrinkProduct 
        smokeproduct:one to Many nullable: SmokeProduct 
      
      
      FoodProduct:
        id:
        product_id (many to one to Product)
        options one to many to foodOptions
      

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

      你能添加一些上下文吗:你为什么需要这样做?上下文实际上与示例相似。。实体产品可搭配多种类型,如葡萄酒、奶酪、烈酒、t恤等。。每种类型都有自己的实体,如WineOptions、CheeseOptions等。。它将保存特定于类型的属性。问题是,将产品与所有可能的选项类型联系起来并不是很好,所以我试图找出如何将产品葡萄酒与葡萄酒选项、产品奶酪与奶酪选项联系起来。。。你已经有了想法,我猜实现一个元模型怎么样,是不是太过分了?或者像ProductOption这样更简单的东西?每个类型都包含它自己的简单字段(字符串、文本、整数…)以及它自己与其他实体和翻译的映射。在这种情况下,使用ProductOption将不起作用,但是您对元模型有什么想法?您可以添加一些上下文吗:为什么需要这样做?上下文实际上与示例类似。。实体产品可搭配多种类型,如葡萄酒、奶酪、烈酒、t恤等。。每种类型都有自己的实体,如WineOptions、CheeseOptions等。。它将保存特定于类型的属性。问题是,将产品与所有可能的选项类型联系起来并不是很好,所以我试图找出如何将产品葡萄酒与葡萄酒选项、产品奶酪与奶酪选项联系起来。。。你已经有了想法,我猜实现一个元模型怎么样,是不是太过分了?或者像ProductOption这样更简单的东西?每个类型都包含它自己的简单字段(字符串、文本、整数…)以及它自己与其他实体和翻译的映射。在这种情况下,使用ProductOption将不起作用,但您对元模型有什么想法?我认为这不会解决主要问题,因为产品必须映射到FoodOption或DrinkOption。为什么不在option和Product之间使用多个选项呢?这类工作必须在您的业务逻辑中完成,除非您的每种产品都没有多个表,否则关系数据库不能将它们区分开来。我认为这不会解决主要问题,因为产品必须映射到FoodOption或DrinkOption。为什么不在选项和产品之间使用多个表呢?这类工作必须在业务逻辑中完成,除非您的每种产品都没有多个表,否则关系数据库不能区分它们。这也是一种可能性,但产品的管理通常会非常困难,对吗?如果您想查看所有产品,您将在数据库中查询几个表否您可以查询产品表这也是一种可能性,但是产品的管理通常会非常困难,对吗?如果要查看所有产品,您将在数据库中查询几个表。您可以查询产品表