如何使用支持表对软枚举进行建模

问题描述 投票:0回答:1

我有一对现有的表,不幸的是我无法更改它们的任何内容,因为它们来自不同的应用程序,并且至少在可预见的未来,该应用程序仍然必须在数据库上工作。

我有两张桌子:

partner

id 状态 致敬
1 1 2
2 2 2
3 1 1
4 1001 0

code

id 代码 设置 标签
21 1 1 “常规”
22 2 1 “贵宾”
23 1001 1 “重复”
24 0 2 “”
25 1 2 “女士”
26 2 2 “先生”

其中

code.set
1
对应于
partner.status
的条目 并且
code.set
2
表示
partner.salutation

的条目

我正在尝试对关系进行建模,但无法找出如何将特定关系限制为仅另一个表的子集:

Entity/Partner.php

<?php

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: PartnerRepository::class)]
class Partner {
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(name: "status", referencedColumnName: "code")]
    private ?Code $status = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(name: "salutation", referencedColumnName: "code")]
    private ?Code $salutation = null;
}

现在对于

label
状态获取错误的
1
,因为当然
status = "regular"
salutation = "Madam"

使用相同的值

理想情况下我想写一些类似的东西

    #[ORM\ManyToOne(filter: "set = 1")]
    #[ORM\JoinColumn(name: "status", referencedColumnName: "code")]
    private ?Code $status = null;

    #[ORM\ManyToOne(filter: "set = 2")]
    #[ORM\JoinColumn(name: "salutation", referencedColumnName: "code")]
    private ?Code $salutation = null;

或者也许添加一个

#[Filter]
属性,但我无法找出应用
Filter
的正确语法/位置。

php doctrine-orm doctrine relationship
1个回答
0
投票

虽然不完全是我正在寻找的解决方案,但我可能最终会为不同的代码集使用继承:

<?php

use Doctrine\ORM\Mapping as ORM;
use App\Repository\CodeRepository;

#[ORM\Entity(repositoryClass: PartnerRepository::class)]
class Partner {
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(name: "status", referencedColumnName: "code")]
    private ?StatusCode $status = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(name: "salutation", referencedColumnName: "code")]
    private ?SalutationCode $salutation = null;
}

#[ORM\Entity(repositoryClass: CodeRepository::class)]
#[ORM\InheritanceType('SINGLE_TABLE')]
#[ORM\DiscriminatorColumn(name: 'set', type: 'bigint')]
#[ORM\DiscriminatorMap([1 => StatusCode::class, 2 => SalutationCode::class])]
class Code {
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\OneToMany(targetEntity: Partner::class)]
    private ?Partner $code = null;

    #[ORM\Column]
    private ?string $label = null;
}
© www.soinside.com 2019 - 2024. All rights reserved.