Doctrine 的更新前生命周期回调更新所有加载的实体,而不仅仅是更新的实体



我在symfony 5应用程序中有一个条令实体;createdAt";以及";updatedAt";字段。正如我在不同的来源中发现的那样,我使用生命周期回调来自动设置值:

/**
* @ORMEntity(repositoryClass=CoinRepository::class)
* @ORMHasLifecycleCallbacks()
*/
class Coin
{
...
/**
* @ORMColumn(type="datetime")
*/
private DateTime $insertedAt;
/**
* @ORMColumn(type="datetime", nullable=true)
*/
private ?DateTime $updatedAt = null;
/**
* @ORMPrePersist()
*/
public function prePersist(): void
{
$this->setInsertedAt(new DateTime());
}
/**
* @ORMPreUpdate()
*/
public function preUpdate(): void
{
$this->setUpdatedAt(new DateTime());
}
...
public function getInsertedAt(): DateTime
{
return $this->insertedAt;
}
public function setInsertedAt(DateTime $insertedAt): void
{
$this->insertedAt = $insertedAt;
}
public function getUpdatedAt(): ?DateTime
{
return $this->updatedAt;
}
public function setUpdatedAt(?DateTime $updatedAt): void
{
$this->updatedAt = $updatedAt;
}
}

现在的问题是,如果我加载所有硬币,只更新其中一个,每个硬币都会得到新的";updatedAt";价值这是我的代码:

$coins = $this->entityManager->getRepository(Coin::class)->findAll();
foreach ($coins as $coin) {
$this->coinUpdater->update($coin);
die; // Just to show that only one coin is updated
}

而";"更新";";coinUpdater":

public function update(Coin $coin): void
{
// Enrich coin
...
$this->entityManager->flush();
}

如果我在控制台的命令中运行这个,我可以看到原理调试,并且每个硬币都被更新,并且在数据库中我可以看到每个硬币都有新的";updatedAt";价值。我没有发现任何关于这个问题的信息。有人知道吗?

我发现了问题。我有一个字段";totalSupply";我这样声明:

/**
* @ORMColumn(type="bigint")
*/
private int $totalSupply;

问题是,如果使用";bigint";变量必须具有类型";字符串";。但因为我把它定义为";int";我一直有这样的变更集:

array(1) {
["totalSupply"]=>
array(2) {
[0]=>
string(7) "1999999"
[1]=>
int(1999999)
}
}

这就是为什么每枚硬币都会在同花顺时更新。我现在将变量定义为字符串,现在它按预期工作。

最新更新