我遇到一個問題,確實,我想要一個根據存在與否面臨更新或插入的函式。
我在 Symfony 檔案中讀到:無論您是創建還是更新物件,作業流程總是相同的:Doctrine 足夠聰明,可以知道它是否應該插入或更新您的物體。
我的存盤庫:
public function refreshAllArticle()
{
$articlesActualise = $this->ApiManager->getAllArticles();
$entityManager = $this->getEntityManager();
foreach ($articlesActualise as $articleActualise) {
$article = new Articles();
$article->setId($articleActualise['id']);
$article->setDateCreation($articleActualise['date_creation']);
$article->setDateModification($articleActualise['date_modification']);
$article->setTitre($articleActualise['titre']);
$article->setContent($articleActualise['content']);
$article->setDescription($articleActualise['description']);
$entityManager->persist($article);
$entityManager->flush();
}
}
我的物體:
#[ORM\Entity(repositoryClass: ArticlesRepository::class)]
class Articles
{
#[ORM\Id]
#[ORM\Column(type: 'integer')]
private $id;
#[ORM\Column(type: 'date')]
private $date_creation;
#[ORM\Column(type: 'date', nullable: true)]
private $date_modification;
#[ORM\Column(type: 'string', length: 255)]
private $titre;
#[ORM\Column(type: 'text', nullable: true)]
private $content;
#[ORM\Column(type: 'text', nullable: true)]
private $description;
#[ORM\Column(type: 'text', nullable: true)]
private $header;
#[ORM\Column(type: 'text', nullable: true)]
private $script;
我的控制器:
#[Route('/refreshArticles', name: 'refreshArticles')]
public function refreshArticle(): RedirectResponse
{
$this->doctrine->getRepository(Articles::class)->refreshAllArticle();
return $this->redirectToRoute('articles');
}
插入作業完美,但如果我想再次呼叫此函式進行更新,我會收到此錯誤:執行查詢時發生例外:SQLSTATE [23000]:完整性約束違規:1062 鍵 'PRIMARY 的重復條目 '60' '
PS:有關資訊,我的 ID 不是自動遞增的,因為我希望能夠插入自己的值
你能幫我嗎謝謝:)
uj5u.com熱心網友回復:
Doctrine 不知道具有給定識別符號的物體是否已經存在。它可以確定它應該對物體做什么(例如,如果您在同一執行中持久化兩次,它只會插入一次,如果您獲取物體,更新并持久化它,它將更新物體)。
但是,您目前總是從現有資料創建一個新物體并將其持久化。相反,您應該首先檢查具有給定 id 的物體是否已經存在。我假設這個存盤庫類擴展了Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository提供“查找”功能以通過 id 獲取物體的類)所以這里是一個例子:
public function refreshAllArticle()
{
$articlesActualise = $this->ApiManager->getAllArticles();
$entityManager = $this->getEntityManager();
foreach ($articlesActualise as $articleActualise) {
// Fetch existing article object
$articleToUpdate = $this->find($articleActualise['id']);
if ($articleToUpdate === null) {
// Article does not exist so we need to create a new object
$articleToUpdate = new Articles();
}
// Update logic goes here using setters on $articleToUpdate
// Just like you previously already did
$entityManager->persist($articleActualise);
$entityManager->flush();
}
}
這樣,您將首先檢查該 id 的物體是否已存在并更新該物體,而不是創建一個新物體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/425510.html
