[英]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.