gpt4 book ai didi

symfony - 如何在 Symfony 中设置 Doctrine 的类继承?

转载 作者:行者123 更新时间:2023-12-04 23:19:57 25 4
gpt4 key购买 nike

我的问题是,我无法掌握 Doctrine 的类继承中的 DiscriminatorColumn 和 DiscriminatorMap。

我有一个被视为父类/表的产品实体。

有几个子实体继承了产品实体。 (型号、零件和选项)

我觉得我应该能够使用主键来链接两个表......但是我如何使用 DiscriminatorColumn 做到这一点?

这是我想要发生的事情的一般想法......

Fetch all model objects from database while inheriting product parent entity


SELECT object 
FROM parts_object parts
LEFT JOIN products_object po
ON parts.product_fk = po.product_id

Or... Fetch all part objects from database while inheriting product parent entity


SELECT object 
FROM parts_object parts
LEFT JOIN products_object po
ON parts.product_fk = po.product_id

理想情况下,我希望使用 Doctrine 而不是某些自定义 SQL 来完成此操作。

我是否需要为父表设置一个“类型”列,以便每一行定义它是零件、模型还是选项?

Doctrine inheritance docs

最佳答案

好的,我会尽量解释得尽可能简单。

让我们从 DiscriminatorColumn 开始

正如它所说,鉴别器列基本上是数据库中的一列。它用于存储一个键,如果您愿意,它有助于根据您的 DiscriminatorMap 确定您当前正在查询的对象类型。配置。
DiscriminatorMap是将每个键映射到实体的方式。你说你有以下

  • 产品 [父]
  • 模型 [ parent 的 child ]
  • 部分 [ parent 的 child ]
  • 选项 [ parent 的 child ]

  • 然后,您的鉴别器图应如下所示,例如:
    @DiscriminatorMap({
    "model" = "AppBundle\Entity\Model",
    "Part" = "AppBundle\Entity\Part",
    "Option" = "AppBundle\Entity\Option"
    })

    Always pay attention to your last definition in your mapping. The last line must end without a comma!



    截至 InheritanceType我建议你使用 @InheritanceType("JOINED")因为这会让你的每个子类都有一个表。

    每个子类都必须扩展您的 Product实体类,显然是父类。每个子类 绝不能定义 $id属性,因为继承映射。

    然后按特定类型查询记录带有以下查询:
    "SELECT product FROM AppBundle\Entity\Product product WHERE product INSTANCE OF AppBundle\Entity\Part"

    查询将仅搜索映射到该实体的记录。

    如果您有任何问题,请随时提出。

    从新评论开始编辑

    -----------------------

    稍微解释一下。您不需要在实体映射中创建任何额外的属性/列。添加此注释的那一刻 @DiscriminatorColumn(name="discr", type="string") Doctrine 将自动为您创建该列。此示例中的列将命名为 discr类型为 VARCHAR .

    I still don't understand what is used to join the tables. How does doctrine know to link the ids between the product and model



    关于这部分。如果您使用 @InheritanceType("JOINED")这意味着您的 GeneratedValue ID 将在您的主要实体中设置 - Product .然后每个扩展 Product 的子实体将自动获得相同的 ID,这就是为什么您不需要指定 $id子实体中的属性。

    最后,例如,您如何检查当前正在查看的实体类型。考虑以下场景,您的每个子实体都扩展了 Product我们将对记录执行虚拟搜索:
    $product = $entityManager->find('AppBundle:Product', 1); // example

    现在,如果你真的去做 var_dump($product)你会注意到一些有趣的事情。该对象将是 Model 的实例, PartOption因为这些实体中的每一个都在您的鉴别器映射中定义,而 Doctrine 会基于此自动映射您的记录。
    稍后,这可以在以下情况下派上用场:
    if( $product instanceof \AppBundle\Entity\Part ) {
    // do something only if that record belongs to part.
    }

    关于symfony - 如何在 Symfony 中设置 Doctrine 的类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29992810/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com