实体中有
isDefault
属性。如果设置为 true,则所有其他实体的 isDefault
属性必须设置为 false
.
有没有没有 QueryBuilder 或纯 SQL 的干净解决方案?如果是这样,解决方案是什么。
TLDR:如何更新 ID 不是特定实体的一个或多个值?
更新
我有一张实体表。只有一个实体可以具有
(bool) isDefault
状态。如果我创建一个新实体,它可以设置为 isDefault = true
所有其他实体必须设置为 isDefault = false
.
您可以标记与 cascade-all 的关系,然后使用带有 persist 的 setter 来持久化更新。 阅读Doctrine: Transitive persistence / Cascade Operation了解更多信息。
class Entity {
#[Column(type: Types::INTEGER)]
protected bool $isDefault;
#[OneToMany(..., cascade: ['persist', 'remove'])]
protected Collection $children;
public function setIsDefault(bool $isDefault) {
$this->isDefault = true;
foreach ($this->children as $child) {
$child->setIsDefault($isDefault);
}
}
}
// In your code:
$entity->setIsDefault(true);
$entityManger->persist($entity);
$entity->flush();
解决方案不是用
isDefault = false
更新所有其他实体,而是只更新那些已经有isDefault = true
的实体。
$entities = $entityManager->getRepository( Entity::class )
->findBy(
[
'isDefault' => true
]
);
foreach( $entities as $entity )
{
$entity->setIsDefault( false );
}
$newEntity = new Entity();
$newEntity->setIsDefault( true );
$entityManager->persist( $newEntity );
$entityManager->flush();
可以使用
findOneBy()
但这是更安全的方法来防止多个实体具有相同的 isDefault = true
状态。