簡體   English   中英

如何更新 Doctrine (Symfony 4) 中未自動生成 $id 的實體?

[英]How can I update an entity where $id is NOT autogenerated in Doctrine (Symfony 4)?

我的 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();

我在插入上沒有問題,但是如果我運行相同的代碼兩次失敗:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'

第二個查詢也是 INSERT,即使我期待 UPDATE。

為了識別您的實體,Doctrine 必須了解它們。 當您手動創建實體時,此步驟由實體管理器的“persist”方法完成。 另一方面,如果您從數據庫中獲取實體,Doctrine 就會知道它的存在。

這就是為什么當您運行此代碼兩次時會出現錯誤的原因。 因為 Doctrine 會嘗試插入一個具有相同 id 的新實體。

@Florian Hermann 評論指出了正確的方向。 如此處所示https://symfony.com/doc/current/doctrine.html#updating-an-object需要先加載對象:

$propertyRepository = $this->em->getRepository(Property::class);

$dbProperty = $propertyRepository->find($id);

if(empty($dbProperty)) {

    $dbProperty = new Property();

} else {

    $dbProperty->setId($id);
}


$dbProperty->set....
$dbProperty->set....
$dbProperty->set...
$this->em->persist($dbProperty);

$this->em->flush();

persist() 告訴 Doctrine “這是新的,請插入”。 如果不知道實體是否已經在數據庫中,正確的方法是merge()。 然后 Doctrine 自我檢查。

所以在你的情況下:

$prop = new Property();
$prop->setId(1);
$prop->setName('baobao');
$this->em->merge($dbProperty); // <- here
$this->em->flush();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM