【问题标题】:Doctrine ORM : Joined table inheritanceDoctrine ORM:连接表继承
【发布时间】:2023-01-26 18:23:39
【问题描述】:

与上一个主题相关:Database : Account table with Joined Tables Inheritance

我在我的数据库(MySQL)中创建了一个连接表继承:

client_id 属性是 PK 和 FK。

现在我需要用 Doctrine ORM 来表示它,但我找不到如何实现它的解决方案。

我使用 Symfony 命令创建了 Client 实体,对于 ClientCompany 实体,我不知道要使用哪种关系,也不知道如何使用 Client ID 作为 CompanyClient 实体的主键。

有谁知道该怎么做?

【问题讨论】:

    标签: symfony inheritance doctrine-orm


    【解决方案1】:

    首先,要非常小心地使用继承,这是 doctrine 的一个非常好的特性,但由于它的对应物,需要非常谨慎地使用。

    对于你的情况,我建议不要尝试将“人”和“公司”放在同一个抽象的“客户”类下,因为概念原因我已经在这个答案中解释过,因为公司和人是完全不同的东西:Symfony 6 inheritance Mapping : How to submit a form depends on a clicked radio button?

    但我仍然会回答如何正确地进行连接表继承:

    抽象客户端.php

    #[Entity]
    #[InheritanceType('JOIN_TABLE')] 
    #[DiscriminatorColumn(name: 'discr', type: 'string')]
    #[DiscriminatorMap(['person' => Person::class, 'company' => Company::class])]
    abstract class Client
    {
        // you do not need clientType since it is hold by the "discr" column
        // And if you want to know what type your client is you can do it using   
        // if($client instanceof Person::class) { do something}
    }
    

    人.php

    #[Entity]
    class Person extends Client
    {
        // ...
    }
    

    公司.php

    #[Entity]
    class Company extends Client
    {
        // ...
    }
    

    看看#[InheritanceType('JOIN_TABLE')] 它将为每个实体创建一个表,它们将共享 ID。 如果你创建一个id为2的公司,就会有一个id为2的客户。所以一个id为2的人永远不可能。

    但是,如果您使用'SINGLE_TABLE',它将只创建一个表,其中包含所有实体的所有字段,该表将为空,具体取决于您在其中插入的子项。

    但我再次强烈建议您不要为您的用例使用连接表继承

    【讨论】:

    • 感谢您的答复。我明白你的意思,因为一个人和一个公司是两个不同的东西。但是,因为在我的例子中,人和公司都可以成为客户,所以我认为最好将这两个表放在一起作为客户(也因为这个项目是创建客户区)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多