与复合唯一约束的关系(symfony + 学说)

Posted

技术标签:

【中文标题】与复合唯一约束的关系(symfony + 学说)【英文标题】:Relation with composite unique constraint (symfony + doctrine) 【发布时间】:2022-01-11 02:52:03 【问题描述】:

我正在尝试创建外键引用不是主键而是复合唯一约束的关系。 为什么?非规范化数据库架构以减少连接数。

#[ORM\Entity(repositoryClass: CurrencyRepository::class)]
#[ORM\UniqueConstraint(fields: ['slug', 'type'])]
#[UniqueEntity(
    fields: ['type', 'slug'],
    message: 'This slug is already in use on that type.',
    errorPath: 'slug',
)]
class Currency

    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private ?int $id;

    #[ORM\Column(type: 'smallint', length: 1)]
    private ?int $type;

    #[ORM\Column(type: 'string', length: 25)]
    private ?string $slug;

    // ...

#[ORM\Entity(repositoryClass: ExchangeRateHistoryTypeRepository::class)]
class ExchangeRateHistoryType

    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private int $id;

    #[ORM\ManyToOne(targetEntity: Currency::class)]
    #[ORM\JoinColumn(name: 'currency_slug', referencedColumnName: 'slug', nullable: false)]
    #[ORM\JoinColumn(name: 'currency_type', referencedColumnName: 'type', nullable: false)]
    private ?Currency $currency;
php bin/console make:migration
php bin/console doctrine:migrations:migrate

一切都好。但是当我尝试将数据添加到 ExchangeRateHistoryType - 错误。 客户端代码:

$exchangeRateHistoryType = new ExchangeRateHistoryType();
$exchangeRateHistoryType->setCurrency($currency);
// ...

$this->entityManager->persist($exchangeRateHistoryType);
$this->entityManager->flush();

在 BasicEntityPersister.php 第 674 行:警告:未定义的数组键“slug”

我做错了什么?

【问题讨论】:

【参考方案1】:

Doctrine 的文档:

不能使用指向非主键的连接列。 Doctrine 会认为这些是主键并使用数据创建延迟加载代理,这可能会导致意外结果。出于性能原因,Doctrine 不能在运行时验证此设置的正确性,而只能通过 Validate Schema 命令。

来源:https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys

【讨论】:

以上是关于与复合唯一约束的关系(symfony + 学说)的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 固定装置和多对多关系(学说)

与学说 Symfony 的条件关系

Symfony学说OneToAll关系

Symfony2 和空关系的学说

如何正确验证表单中带有 symfony json 约束的学说类型“json”?

Symfony 学说 i18n 行为数据加载失败:违反完整性约束