Postgres Symfony中的部分唯一索引


Postgres Partial Unique Indexes in Symfony

Postgres可以做部分唯一索引,但我找不到任何教义文档表明对此有任何支持。

http://www.postgresql.org/docs/current/interactive/indexes-partial.html#INDEXES-PARTIAL-EX3

如何在Symfony中拥有一个实体,例如电子邮件。我想存储默认电子邮件的布尔标志的位置。

电子邮件表如下所示,

id,user_id,email,default
1,1,email@something.com,false
2,1,email2@something.com,true
3,1,email3@something.com,false

我想要对user_id和默认值 = true 进行唯一约束。

SQL 我会做这样的事情,

CREATE UNIQUE INDEX default_constraint ON emails (user_id)
    WHERE default;

有没有其他方法可以做到这一点? 我考虑了实体中的 prePersist 函数,但这需要数据库调用来检查。

编辑:我也在考虑一个事件侦听器,http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html

不确定我是否要侦听每个 prePersist 事件,我是否可以侦听特定的实体,而不必使用 if 语句进行过滤。 例如,如果($entity 实例的产品){

Postgres 9.0+ 中有一个非常简洁的结构,称为排除约束。在CREATE TABLE的文档中有简要的解释。由于在此示例中,我们仅依赖于排除约束的谓词部分,而不是运算符的灵活性,因此尽管文档建议,我还是会使用 B 树索引。如果您搜索"postgres 索引类型",您可以阅读一些有关不同索引类型的信息。目前我不能在一个答案中发布多个链接,因为我是新来的,所以你只需要谷歌它。:)

这个小提琴是它如何工作的一个例子。基本上,EXCLUDE末尾的谓词将约束转换为仅在WHERE "default" = true应用UNIQUE

如果可能有其他应用程序与表交互,这可能是最佳路径,但如果信息可用且在前端应用了约束,则向客户端提供反馈可能会更快。

我认为教义现在确实支持这一点!在教义注释参考,特别是在@index部分。

<?php
/**
 * @Entity
 * @Table(name="ecommerce_products",indexes={@Index(name="search_idx", columns={"name", "email"}, options={"where": "(((id IS NOT NULL) AND (name IS NULL)) AND (email IS NULL))"})})
 */
class ECommerceProduct
{
}

编写 UniqueConstraint 注释

use Doctrine'ORM'Mapping as ORM;
/**
 * @ORM'Table(
 *     name="my_table",
 *     uniqueConstraints={
 *         @ORM'UniqueConstraint(name="uc__my_table__field", columns={"field"}),
 *     },
 * )
 */

然后尝试生成迁移

./bin/console doctrine:migrations:diff