我有一对现有的表,不幸的是我无法更改它们的任何内容,因为它们来自不同的应用程序,并且至少在可预见的未来,该应用程序仍然必须在数据库上工作。
我有两张桌子:
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
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;
}