Php 条令';s";选项“;@UniqueConstraint中的属性不起作用 上下文

Php 条令';s";选项“;@UniqueConstraint中的属性不起作用 上下文,php,doctrine-orm,Php,Doctrine Orm,我使用的是2.5.0版条令,我有两个实体:组和项。我正在尝试创建一个唯一的约束,以便项在组中不能具有相同的位置: /** * @Entity * @Table(uniqueConstraints={ * @UniqueConstraint(name="position", columns={"group_id", "position"}) * ) */ class Item { ... } 这很有效 问题 我在项目实体中添加了一个active字段,因

我使用的是2.5.0版条令,我有两个实体:
。我正在尝试创建一个唯一的约束,以便
组中不能具有相同的
位置

/**
* @Entity
* @Table(uniqueConstraints={
*            @UniqueConstraint(name="position", columns={"group_id", "position"})
*       )
*/
class Item {
    ...
}
这很有效


问题 我在项目实体中添加了一个
active
字段,因此我没有删除
项目
,而是将其“停用”。但是现在唯一约束不再起作用了,因为
与他的
引用和他的
位置
一起留在数据库中


尝试 查看该原则,我发现我可以在
@UniqueConstraint
中使用带有where子句的
options
属性:

/**
* @Entity
* @Table(uniqueConstraints={
*            @UniqueConstraint(name="position", columns={"group_id", "position"},
*                              options={"where":"(active = 1)"})}
*       )
*/
class Item {
    ...
}
但是,我得到了与以前相同的错误:

SQLSTATE[23000]:完整性约束冲突:1062重复项 “1-1”表示键“位置”

这是我的删除代码:

$item->setActive(false);
$this->_em->persist($item);
$this->_em->flush();

foreach ($item->getNextItems() as $nextItem) {
    $nextItem->setPosition($nextItem->getPosition() - 1);
    $this->_em->persist($nextItem);
}

$this->_em->flush();
知道为什么
选项
属性不起作用吗


更新

我意识到一种奇怪的行为。每次运行命令
/orm:schema-tool:update--force时,它都会重新创建索引:

DROP INDEX position ON Item;
CREATE UNIQUE INDEX position ON Item (group_id, position);
但是,一旦我删除了
options
属性并运行该命令,我就会得到:

无需更新-您的数据库已与当前数据库同步 实体元数据


如果数据库中已有数据,则在首先添加唯一约束后,请在数据库中检查是否有唯一值。

我似乎从原则中阅读了以下内容:

用于部分索引的SQL WHERE条件。它只对受支持的平台有效

之后:

MySQL不支持这种性质的部分索引

我的解决方案是检查
在实体中是否真的是唯一的:

/**
 * @PostPersist @PostUpdate
 */
public function checkUnicity(LifecycleEventArgs $eventArgs)
{
    $entity = $eventArgs->getEntity();
    $em = $eventArgs->getEntityManager();

    // checking unicity here
    // throw exception if not

}

它们已经是独一无二的了。无论如何,如果不是这样,我在运行
orm:schema-tool:update