首页 > 解决方案 > 如何更新没有在 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。

标签: phpsymfonydoctrine

解决方案


为了识别你的实体,Doctrine 必须知道它们。当您手动创建实体时,此步骤由实体管理器的“持久”方法完成。另一方面,如果您从数据库中获取实体,Doctrine 将已经知道它的存在。

这就是为什么当您运行此代码两次时会出现错误的原因。因为 Doctrine 会尝试插入一个具有相同 id 的新实体。


推荐阅读