教义和复合唯一键
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 可以根据
属性名称
由于
videoDimension
和videoBitrate
都是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错误?
使用 Laravel 的 foreignIdFor 方法并创建复合唯一键