Php 条令';s";选项“;@UniqueConstraint中的属性不起作用 上下文
我使用的是2.5.0版条令,我有两个实体: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字段,因
组
和项
。我正在尝试创建一个唯一的约束,以便项
在组中不能具有相同的位置
:
/**
* @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