原则和复合唯一键


96

我想在理论上做复合唯一密钥。这些是我的领域:

/**
 * @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;

我该如何证明这些组合在一起的组合键是唯一的组合键?

Answers:


217

回答问题:

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


3
谢谢您提供的信息〜作为说明,如果您解决了自己的问题,虽然您不能立即接受,但通常这是接受您自己的答案的好方法,就像人们在搜索一样,它表明存在一个可接受的答案。
Rixius

2
是否可以通过-ToOne关联(外键)来做到这一点?
Dimitry K

5
我知道这是旧帖子,但是@Dimitry K有可能。只需使用@ORM \ JoinColumn(name =“ join_table_id”,referencedColumnName =“ id”,nullable = false)中的列名即可。这是“ join_table_id”。
2015年

请注意,您必须提供名,而不是字段名。因此,您必须将camelCase转换为snake_case并追加_id关联,因为这是Doctrine生成列名的方式。
gronostaj

名称是自动生成的@Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})}),其他都没关系
Vasilii Suricov '19

18

我发现use只有ORM 更冗长,然后ORM在注释中加上前缀。还要注意,您可以将注释分成几行以使其更具可读性,尤其是当您要提及多个项目时(在以下示例中为index)。

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

2

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

如果您需要的是复合主键,事情实际上要简单得多。(当然,这保证了唯一性)通过该URL,Doctrine文档包含一些不错的示例: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;

这里有一些注意事项:

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

您所做的是一个复合主键。当然它将是唯一的,但这是主键...;)
Preciel

好吧,是的,我想我已经在回答中提到过:)实际上,如果OP并非故意创建PK(这就是公认的答案),那么术语“唯一索引”在OP的情况下会更合适。但是由于该问题包含一个奇怪的术语“复合唯一密钥”-我不明白为什么我们不能认为它是一个复合主密钥-至少这是我遇到此问题时一直在寻找的东西。干杯!
Stas Parshyn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.