我想在教义中做复合唯一键。这些是我的领域:
/**
* @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;
我怎样才能证明这些组合在一起是复合的唯一钥匙?
回答问题:
use DoctrineORMMappingUniqueConstraint;
/**
* CommonModelEntityVideoSettings
*
* @Table(name="video_settings",
* uniqueConstraints={
* @UniqueConstraint(name="video_unique",
* columns={"video_dimension", "video_bitrate"})
* }
* )
* @Entity
*/
请参阅@UniqueConstraint
如果有人想使用 PHP 8 属性而不是教义注释:
use DoctrineORMMapping as ORM;
#[ORMEntity]
#[ORMUniqueConstraint(
name: 'video_unique_idx',
columns: ['video_dimension', 'video_bitrate']
)]
我发现只use
ORM 然后在注释中前缀ORM
更冗长。另请注意,您可以将注释分成几行以使其更具可读性,尤其是在您有几个项目要提及的情况下(以下示例中的索引)。
use DoctrineORMMapping as ORM;
/**
* VideoSettings
*
* @ORMCache(usage="NONSTRICT_READ_WRITE")
* @ORMEntity(repositoryClass="AppBundleRepositoryVideoSettingsRepository")
* @ORMTable(name="emails", uniqueConstraints={
* @ORMUniqueConstraint(name="dimension_bitrate", columns={"video_dimension", "video_bitrate"})
* }, indexes={
* @ORMIndex(name="name", columns={"name"})
* })
*/
class VideoSettings
这是一个老问题,但我在寻找创建复合 PK 的方法时遇到了它,并认为它可以使用一些更新。
如果您需要的是复合主键,事情实际上要简单得多。(当然,这保证了唯一性)教义文档包含以下网址的一些很好的例子:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html
因此,原始示例可能如下所示:
/**
* @var string $videoDimension
*
* @ORMId @ORMColumn(type="string")
*/
private $videoDimension;
/**
* @var string $videoBitrate
*
* @ORMId @ORMColumn(type="string")
*/
private $videoBitrate;
这里有一些注意事项:
- 省略了"名称"列,因为教义能够根据属性名称
- 由于
videoDimension
和videoBitrate
都是PK的一部分 - 无需指定nullable = false
- 如果需要 - 复合 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