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 DoctrineORMMapping as ORM;
/**
* @ORMTable(
* name="my_table",
* uniqueConstraints={
* @ORMUniqueConstraint(name="uc__my_table__field", columns={"field"}),
* },
* )
*/
然后尝试生成迁移
./bin/console doctrine:migrations:diff