doctrine - 如何通过 ID 更新除一行以外的所有行

问题描述 投票:0回答:2

实体中有

isDefault
属性。如果设置为 true,则所有其他实体的
isDefault
属性必须设置为
false
.

有没有没有 QueryBuilder 或纯 SQL 的干净解决方案?如果是这样,解决方案是什么。

TLDR:如何更新 ID 不是特定实体的一个或多个值?

更新

我有一张实体表。只有一个实体可以具有

(bool) isDefault
状态。如果我创建一个新实体,它可以设置为
isDefault = true
所有其他实体必须设置为
isDefault = false
.

php doctrine
2个回答
0
投票

您可以标记与 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();


0
投票

解决方案不是用

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
状态。

© www.soinside.com 2019 - 2024. All rights reserved.