教义和复合唯一键

Posted

技术标签:

【中文标题】教义和复合唯一键【英文标题】:Doctrine and composite unique keys 【发布时间】:2012-09-20 10:31:08 【问题描述】:

我想在学说中做复合唯一键。 这些是我的领域:

/**
 * @var string $videoDimension
 *
 * @Column(name="video_dimension", type="string", nullable=false)
 */
private $videoDimension;

/**
 * @var string $videoBitrate
 *
 * @Column(name="video_bitrate", type="string", nullable=false)
 */
private $videoBitrate;

我如何证明那些组合在一起是复合唯一键的学说?

【问题讨论】:

【参考方案1】:

回答问题:

use Doctrine\ORM\Mapping\UniqueConstraint;

/**
 * Common\Model\Entity\VideoSettings
 *
 * @Table(name="video_settings", 
 *    uniqueConstraints=
 *        @UniqueConstraint(name="video_unique", 
 *            columns="video_dimension", "video_bitrate")
 *    
 * )
 * @Entity
 */

见@UniqueConstraint

【讨论】:

感谢您的信息~作为说明,如果您解决了自己的问题,虽然您不能立即接受,但通常接受您自己的答案是一种很好的形式,这样如果人们正在搜索,它显示为有可接受的答案。 是否可以使用-ToOne 关联(外键)来做到这一点? 我知道这是旧帖子,但@Dimitry K 是可能的。只是你需要在@ORM\JoinColumn(name="join_table_id", referencedColumnName="id", nullable=false) 中使用列名。这是“join_table_id”。 请注意,您必须提供 名称,而不是字段名称。因此,您必须将 camelCase 转换为 snake_case 并附加 _id 以进行关联,因为这就是 Doctrine 生成列名的方式。 名称是自动生成的@Table(uniqueConstraints=@UniqueConstraint(columns="case_id", "duration")),其他都无所谓【参考方案2】:

我发现 use 仅 ORM 更冗长,然后在注释中添加 ORM 前缀。另请注意,您可以将注释分成几行以使其更具可读性,尤其是当您要提及多个项目时(下例中的索引)。

use Doctrine\ORM\Mapping as ORM;

/**
 * VideoSettings
 *
 * @ORM\Cache(usage="NONSTRICT_READ_WRITE")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\VideoSettingsRepository")
 * @ORM\Table(name="emails", uniqueConstraints=
 *      @ORM\UniqueConstraint(name="dimension_bitrate", columns="video_dimension", "video_bitrate")
 * , indexes=
 *      @ORM\Index(name="name", columns="name")
 * )
 */
class VideoSettings

【讨论】:

【参考方案3】:

如果有人想使用 PHP 8 属性 而不是 Doctrine 注释:

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\UniqueConstraint(
  name: 'video_unique_idx',
  columns: ['video_dimension', 'video_bitrate']
)]

【讨论】:

【参考方案4】:

我知道这是一个老问题,但我在寻找创建复合 PK 的方法时遇到了它,并认为它可以使用一些更新。

如果您需要的是复合主键,事情实际上要简单得多。 (当然,这保证了唯一性)Doctrine 文档包含一些很好的例子,通过这个 url:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

所以原始示例可能如下所示:

/**
 * @var string $videoDimension
 *
 * @ORM\Id @ORM\Column(type="string")
 */
private $videoDimension;

/**
 * @var string $videoBitrate
 *
 * @ORM\Id @ORM\Column(type="string")
 */
private $videoBitrate;

这里有几点说明:

    “名称”列被省略,因为 Doctrine 可以根据 属性名称 由于videoDimensionvideoBitrate 都是PK 的一部分 - 无需指定nullable = false 如果需要 - Composite PK 可能由外键组成,因此请随意添加一些关系映射

【讨论】:

您所做的是复合主键。当然它会是唯一的,但它是一个主键...... ;) 嗯,是的,我想我已经在回答中提到了这一点:) 实际上,如果他不是要创建 PK,那么“唯一索引”一词在 OP 的情况下会更合适(这就是接受的答案确实如此)。但是由于这个问题包含一个奇怪的术语“复合唯一键”——我不明白为什么我们不能假设它是一个复合主键——至少这是我遇到这个问题时一直在寻找的。干杯!【参考方案5】:

XML 版本:

<unique-constraints>
    <unique-constraint columns="column1,column2" name="give_some_explicit_name" />
</unique-constraints>

文档中的更多详细信息: https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/xml-mapping.html#defining-indexes-or-unique-constraints

【讨论】:

以上是关于教义和复合唯一键的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine2 Merge() 因复合索引而失败教义2错误?

如何使复合键唯一?

使用 Django 的复合/复合主/唯一键

使用 Laravel 的 foreignIdFor 方法并创建复合唯一键

如何在 Sequelize 中使用外键和常规键创建复合唯一约束?

复合可分解唯一键