php - 如何更新没有在 Doctrine (Symfony 4) 中自动生成 $id 的实体?
问题描述
我的 Symfony 4 实体有一个非自动增量 ID:
/**
* @ORM\Entity(repositoryClass="App\Repository\PropertyRepository")
*/
class Property
{
/**
* @ORM\Id()
* @ORM\Column(type="integer")
*/
protected $id;
.....
public function setId($id): self
{
$this->id = $id;
return $this;
}
我使用setId()
方法自己设置。
$prop = new Property();
$prop->setId(1);
$prop->setName('baobao');
$this->em->persist($dbProperty);
$this->em->flush();
我在 INSERT 上没有问题,但是如果我运行相同的代码两次如果失败:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'
第二个查询也是一个 INSERT,即使我期待一个 UPDATE。
解决方案
为了识别你的实体,Doctrine 必须知道它们。当您手动创建实体时,此步骤由实体管理器的“持久”方法完成。另一方面,如果您从数据库中获取实体,Doctrine 将已经知道它的存在。
这就是为什么当您运行此代码两次时会出现错误的原因。因为 Doctrine 会尝试插入一个具有相同 id 的新实体。
推荐阅读
- macos - 在同一台机器上运行 Elm 0.18 和 0.19
- ios - 无法在 iMessage 扩展中显示 Documents 目录中的贴纸
- powerbi - 在高级容量上上传的 Power BI 模型能否增长到超过 12 GB?
- python - 使用 CNN 对长格式音频进行关键字定位的特征提取
- ios - 调用 URL 字符串时出现致命错误,在展开可选值时为零
- android - 在启动结束时运行系统应用程序已完成
- matlab - 查找两点之间的距离
- android - 单元测试:观察者 onChanged 应该被调用两次而不是一次
- python - 递归问题,函数接受 3 个位置参数,但给出了 4 个
- r - 基于全连接的条件合并