@UniqueConstraint 和@Column(unique=true) 选项之间的 Doctrine ORM 级别差异
Doctrine ORM level difference between @UniqueConstraint and @Column(unique=true) options
在数据库级别,使用一个选项而不是另一个选项来定义 UNIQUENESS 时没有区别,如下所示。尽管 @UniqueConstraint
在其文档中读到“它仅在 SchemaTool 模式生成上下文中有意义 ”,但两者之间是否存在 ORM 级别差异?我的意思是当我们 运行 查询时,事情的处理方式会有所不同吗?
- @UniqueConstraint
- @Column(唯一=真)
示例 - @UniqueConstraint
CLASS
/**
* @ORM\Entity
* @ORM\Table(
* name="user",
* uniqueConstraints={
* @ORM\UniqueConstraint(columns={"email"})
* }
* )
*/
class User
{
/**
* @ORM\Column(name="email", type="string", length=100)
*/
private $email;
}
DQL
CREATE TABLE `user` (
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
UNIQUE KEY `UNIQ_8D93D649E7927C74` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
示例 - @Column - unique=true
CLASS
/**
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User
{
/**
* @ORM\Column(name="email", type="string", length=100, unique=true)
*/
private $email;
}
DQL
CREATE TABLE `user` (
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
UNIQUE KEY `UNIQ_8D93D649E7927C74` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
基本没有区别。两者都在列上创建唯一键。
但是@UniqueConstraint
有更多的可能性。使用 @UniqueConstraint
您可以为键指定一个名称或跨越多个列。缺点是要输入更多(不是更糟)并且列名必须是数据库中的列名,而不是 php 属性 名称。
unique=true
on the @Column
是在单个列上创建唯一键的最简单方法。
而运行查询,没有区别。 ORM 不关心唯一定义。特别是在插入时,您会从数据库而不是 ORM 中因唯一性违规而崩溃。您必须自己确保唯一性,例如使用 Symfony 中的唯一实体验证。
在数据库级别,使用一个选项而不是另一个选项来定义 UNIQUENESS 时没有区别,如下所示。尽管 @UniqueConstraint
在其文档中读到“它仅在 SchemaTool 模式生成上下文中有意义 ”,但两者之间是否存在 ORM 级别差异?我的意思是当我们 运行 查询时,事情的处理方式会有所不同吗?
- @UniqueConstraint
- @Column(唯一=真)
示例 - @UniqueConstraint
CLASS
/**
* @ORM\Entity
* @ORM\Table(
* name="user",
* uniqueConstraints={
* @ORM\UniqueConstraint(columns={"email"})
* }
* )
*/
class User
{
/**
* @ORM\Column(name="email", type="string", length=100)
*/
private $email;
}
DQL
CREATE TABLE `user` (
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
UNIQUE KEY `UNIQ_8D93D649E7927C74` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
示例 - @Column - unique=true
CLASS
/**
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User
{
/**
* @ORM\Column(name="email", type="string", length=100, unique=true)
*/
private $email;
}
DQL
CREATE TABLE `user` (
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
UNIQUE KEY `UNIQ_8D93D649E7927C74` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
基本没有区别。两者都在列上创建唯一键。
但是@UniqueConstraint
有更多的可能性。使用 @UniqueConstraint
您可以为键指定一个名称或跨越多个列。缺点是要输入更多(不是更糟)并且列名必须是数据库中的列名,而不是 php 属性 名称。
unique=true
on the @Column
是在单个列上创建唯一键的最简单方法。
而运行查询,没有区别。 ORM 不关心唯一定义。特别是在插入时,您会从数据库而不是 ORM 中因唯一性违规而崩溃。您必须自己确保唯一性,例如使用 Symfony 中的唯一实体验证。