gpt4 book ai didi

php - 教义实体未保存,但具有自动增量 id

转载 作者:行者123 更新时间:2023-11-29 15:14:14 25 4
gpt4 key购买 nike

我们的项目中有一个奇怪的问题,某些 Doctrine 实体没有被保存。该问题并非每次都会出现,而是间歇性出现,而且我们不知道是什么原因造成的。

我们有两个链接的实体,因此保存:

$one = (new One)
->setValues()
...
;
$two = (new Two)
->setOne($one)
->setUser($user)
;
$em->persist($one);
$em->persist($two);
$em->flush();

关系/实体定义如下:

class User {
...

/**
* @var Two[]|Collection
* @ORM\OneToMany(targetEntity="Two", mappedBy="user")
*/
private $twos;
...
}

class One {
...
/**
* @var Two[]|Collection
* @ORM\OneToMany(targetEntity="Two", mappedBy="one")
*/
private $twos;
...
}

Class Two {
...
/**
* Note this field in the db is an auto-increment
* @ORM\Column(name="two_id", type="integer")
*/
private $id;
/**
* @var One
* @ORM\Id()
* @ORM\ManyToOne(targetEntity="One", inversedBy="twos")
* @ORM\JoinColumn(name="one_id", referencedColumnName="one_id")
*/
private $one;
/**
* @var User
* @ORM\Id()
* @ORM\ManyToOne(targetEntity="User", inversedBy="twos")
* @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
*/
private $user;
...
}

我们没有看到任何错误,当我们在 DBAL 中启用调试日志记录时,我们可以看到事务开始的日志条目、所有 插入(包括 Two )和提交。我们无法在本地重现该问题,因此无法使用单步调试器来解决该问题。大多数时候两个实体都会被保存,但并非每次都被保存。

如果我们从 ObjectManager 中清除 Two 实体并尝试从数据库重新加载它,则表明它确实有一个 id。

$em->clear(Two::class);

$two = $twoRepository->findTwo($user, $one);
if ($two) {
$logger->info('Two created', ['two' => $two->getId(),]);
}

现在,当我们出现 Two 未保存时,我们可以看到输出 id 的日志,但是当我们检查相关的数据库表时,没有包含该 id 的行就在其中。

任何时候都不会引发异常,我们看不到任何其他可能表明存在问题的日志。

我们不知道会发生什么。实体被赋予自动增量但未保存这一事实表明数据库事务中可能存在问题。但是,据我了解,事务将在调用 flush() 期间发生,并且没有迹象表明该事务必须回滚。再加上随后从数据库重新加载实体的调用发生在这之后,因此 Doctrine 必须从数据库或它的内部对象存储中检索该实体(尽管我理解 clear() 应该意味着它必须返回数据库才能加载该实体)。

最佳答案

误报。事实证明,我们的系统允许用户从 UI 中删除实体 Two(但不允许删除实体 One)。该网站的流量相当高,并且一群用户在创建实体后不久就这样做了,这使得实体看起来根本没有被创建。

关于php - 教义实体未保存,但具有自动增量 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59825029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com