原则和组合唯一密钥

我想在学说上做合成唯一键。 那些是我的领域:

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

我怎样才能证明那些组合在一起的东西是复合唯一的钥匙呢?

77940 次浏览

回答问题:

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

我发现它对于仅 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

我知道这是一个老问题,但是我在寻找创建复合 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;

以下是一些注意事项:

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

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

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

use Doctrine\ORM\Mapping as ORM;


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