【问题标题】:Doctrine ORM level difference between @UniqueConstraint and @Column(unique=true) options@UniqueConstraint 和 @Column(unique=true) 选项之间的 Doctrine ORM 级别差异
【发布时间】:2016-01-16 17:53:23
【问题描述】:

在数据库级别,使用一个而不是另一个选项来定义 UNIQUENESS 时没有区别,如下所示。尽管@UniqueConstraint 在其文档中读到“它仅在 SchemaTool 模式生成上下文中有意义”,但两者之间是否存在 ORM 级别差异?我的意思是当我们运行查询时,事情的处理方式是否不同?

示例 - @UniqueConstraint

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

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

【问题讨论】:

    标签: symfony orm doctrine-orm doctrine


    【解决方案1】:

    基本没有区别。两者都在列上创建唯一键。

    但是@UniqueConstraint 有更多的可能性。使用@UniqueConstraint,您可以为键命名或跨越多个列。缺点是要键入更多内容(没有那么糟糕),并且列名必须是数据库中的列名,而不是 php 属性名。

    @Column 上的unique=true 是在单个列上创建唯一键的最简单方法。

    在运行查询时,没有区别。 ORM 不关心唯一定义。特别是在插入时,您会从数据库中获得关于唯一性违规的崩溃,而不是来自 ORM。您必须自己确保唯一性,例如使用 Symfony 中的唯一实体验证。

    【讨论】:

    • 我遇到了一个问题,如果你有一个表继承,它只搜索我们使用的那种类型的唯一(例如)电子邮件。就我而言,我有AbstractUserTeacherStudent 与公用表user 的继承。而且它不会在整个表中找到,它只能找到 teacher 类型。为了防止这种情况,您可以在UniqueEntity 中设置entityClass。在我的例子中,它是AbstractUser,也就是你的普通(抽象)类。希望它对某人有所帮助。
    • 仅供参考,在 Symfony 中,unique validation docs
    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2019-01-07
    • 1970-01-01
    • 2014-12-07
    • 2017-06-14
    • 2023-03-14
    相关资源
    最近更新 更多