{"id":1125,"date":"2025-06-12T13:35:48","date_gmt":"2025-06-12T05:35:48","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1125.html"},"modified":"2025-06-12T13:35:48","modified_gmt":"2025-06-12T05:35:48","slug":"php-doctrine-upsert%ef%bc%9a%e8%8b%a5%e5%ad%98%e5%9c%a8%e5%88%99%e6%9b%b4%e6%96%b0%ef%bc%8c%e8%8b%a5%e4%b8%8d%e5%ad%98%e5%9c%a8%e5%88%99%e6%8f%92%e5%85%a5","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1125.html","title":{"rendered":"PHP Doctrine Upsert\uff1a\u82e5\u5b58\u5728\u5219\u66f4\u65b0\uff0c\u82e5\u4e0d\u5b58\u5728\u5219\u63d2\u5165"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; PHP &#20013;&#20351;&#29992; Doctrine &#36827;&#34892;&#25968;&#25454;&#25805;&#20316;&#26102;&#65292;<code>Upsert<\/code>&#65288;&#21363; Update &#25110; Insert&#65289;&#26159;&#19968;&#31181;&#24120;&#35265;&#30340;&#38656;&#27714;&#12290;Doctrine &#25552;&#20379;&#20102;&#22810;&#31181;&#26041;&#27861;&#26469;&#23454;&#29616;&#36825;&#19968;&#21151;&#33021;&#65292;&#21253;&#25324; <code>save<\/code> &#26041;&#27861;&#21644; <code>merge<\/code> &#26041;&#27861;&#12290;&#20197;&#19979;&#26159;&#36825;&#20004;&#31181;&#26041;&#27861;&#30340;&#31034;&#20363;&#65306;<\/p>\n<h3>&#20351;&#29992; <code>save<\/code> &#26041;&#27861;<\/h3>\n<pre><code class=\"language-php\">use DoctrineORMEntityManagerInterface;\nuse DoctrineORMOptimisticLockException;\n\n\/\/ &#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; 'User' &#30340;&#23454;&#20307;&#31867;\nclass User {\n    private $id;\n    private $name;\n\n    \/\/ Getters and Setters\n}\n\n\/\/ &#33719;&#21462; EntityManager &#23454;&#20363;\n$entityManager = $this-&gt;getDoctrine()-&gt;getManager();\n\ntry {\n    \/\/ &#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#29992;&#25143;&#23454;&#20363;\n    $user = new User();\n    $user-&gt;setName('John Doe');\n\n    \/\/ &#23581;&#35797;&#20445;&#23384;&#29992;&#25143;&#65292;&#22914;&#26524;&#29992;&#25143;&#24050;&#32463;&#23384;&#22312;&#65292;&#21017;&#26356;&#26032;&#65307;&#22914;&#26524;&#19981;&#23384;&#22312;&#65292;&#21017;&#25554;&#20837;\n    $entityManager-&gt;persist($user);\n    $entityManager-&gt;flush();\n\n    echo \"User saved successfully.\";\n} catch (OptimisticLockException $e) {\n    echo \"Optimistic lock exception occurred: \" . $e-&gt;getMessage();\n}<\/code><\/pre>\n<h3>&#20351;&#29992; <code>merge<\/code> &#26041;&#27861;<\/h3>\n<pre><code class=\"language-php\">use DoctrineORMEntityManagerInterface;\nuse DoctrineORMOptimisticLockException;\n\n\/\/ &#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; 'User' &#30340;&#23454;&#20307;&#31867;\nclass User {\n    private $id;\n    private $name;\n\n    \/\/ Getters and Setters\n}\n\n\/\/ &#33719;&#21462; EntityManager &#23454;&#20363;\n$entityManager = $this-&gt;getDoctrine()-&gt;getManager();\n\ntry {\n    \/\/ &#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#29992;&#25143;&#23454;&#20363;\n    $user = new User();\n    $user-&gt;setName('John Doe');\n\n    \/\/ &#20351;&#29992; merge &#26041;&#27861;&#23581;&#35797;&#20445;&#23384;&#29992;&#25143;&#65292;&#22914;&#26524;&#29992;&#25143;&#24050;&#32463;&#23384;&#22312;&#65292;&#21017;&#26356;&#26032;&#65307;&#22914;&#26524;&#19981;&#23384;&#22312;&#65292;&#21017;&#25554;&#20837;\n    $existingUser = $entityManager-&gt;getRepository(User::class)-&gt;findOneBy(['name' =&gt; $user-&gt;getName()]);\n    if ($existingUser) {\n        $entityManager-&gt;merge($user);\n    } else {\n        $entityManager-&gt;persist($user);\n    }\n    $entityManager-&gt;flush();\n\n    echo \"User saved successfully.\";\n} catch (OptimisticLockException $e) {\n    echo \"Optimistic lock exception occurred: \" . $e-&gt;getMessage();\n}<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#31616;&#21333;&#30340; <code>User<\/code> &#34920;&#65292;&#24182;&#19988;&#25105;&#20204;&#24076;&#26395;&#26681;&#25454;&#29992;&#25143;&#21517;&#25554;&#20837;&#25110;&#26356;&#26032;&#29992;&#25143;&#20449;&#24687;&#12290;<\/p>\n<h4>1. &#23450;&#20041;&#23454;&#20307;&#31867;<\/h4>\n<pre><code class=\"language-php\">use DoctrineORMMapping as ORM;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryUserRepository\")\n *\/\nclass User\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=255)\n     *\/\n    private $name;\n\n    \/\/ Getters and Setters\n}<\/code><\/pre>\n<h4>2. &#23450;&#20041; Repository &#31867;<\/h4>\n<pre><code class=\"language-php\">namespace AppRepository;\n\nuse DoctrineORMEntityRepository;\n\nclass UserRepository extends EntityRepository\n{\n    public function findByUsername(string $username): ?User\n    {\n        return $this-&gt;createQueryBuilder('u')\n            -&gt;where('u.name = :username')\n            -&gt;setParameter('username', $username)\n            -&gt;getQuery()\n            -&gt;getOneOrNullResult();\n    }\n}<\/code><\/pre>\n<h4>3. &#20351;&#29992; <code>save<\/code> &#21644; <code>merge<\/code> &#26041;&#27861;<\/h4>\n<pre><code class=\"language-php\">use DoctrineORMEntityManagerInterface;\nuse DoctrineORMOptimisticLockException;\n\n\/\/ &#33719;&#21462; EntityManager &#23454;&#20363;\n$entityManager = $this-&gt;getDoctrine()-&gt;getManager();\n\ntry {\n    \/\/ &#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#29992;&#25143;&#23454;&#20363;\n    $user = new User();\n    $user-&gt;setName('John Doe');\n\n    \/\/ &#23581;&#35797;&#20445;&#23384;&#29992;&#25143;&#65292;&#22914;&#26524;&#29992;&#25143;&#24050;&#32463;&#23384;&#22312;&#65292;&#21017;&#26356;&#26032;&#65307;&#22914;&#26524;&#19981;&#23384;&#22312;&#65292;&#21017;&#25554;&#20837;\n    $entityManager-&gt;persist($user);\n    $entityManager-&gt;flush();\n\n    echo \"User saved successfully.\";\n} catch (OptimisticLockException $e) {\n    echo \"Optimistic lock exception occurred: \" . $e-&gt;getMessage();\n}<\/code><\/pre>\n<p>&#36890;&#36807;&#36825;&#20123;&#31034;&#20363;&#65292;&#20320;&#21487;&#20197;&#30475;&#21040;&#22914;&#20309;&#20351;&#29992; Doctrine &#36827;&#34892; <code>Upsert<\/code> &#25805;&#20316;&#65292;&#20197;&#30830;&#20445;&#22312;&#25968;&#25454;&#24211;&#20013;&#22788;&#29702;&#29992;&#25143;&#30340;&#25554;&#20837;&#25110;&#26356;&#26032;&#36923;&#36753;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#27010;&#36848;<\/h2><p>&#26377;&#25928;&#31649;&#29702;&#25968;&#25454;&#24211;&#23545;&#20110;&#24212;&#29992;&#31243;&#24207;&#30340;&#24615;&#33021;&#21644;&#21487;&#25193;&#23637;&#24615;&#33267;&#20851;&#37325;&#35201;&#12290;&#22312;PHP&#24320;&#21457;&#39046;&#22495;&#65292;Doctrine&#26159;&#19968;&#20010;&#24191;&#27867;&#20351;&#29992;&#30340;ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#65292;&#20801;&#35768;&#24320;&#21457;&#32773;&#36890;&#36807;&#38754;&#21521;&#23545;&#35937;&#30340;&#26041;&#24335;&#19982;&#25968;&#25454;&#24211;&#20132;&#20114;&#12290;&#22312;&#36825;&#31687;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#28145;&#20837;&#25506;&#35752;&ldquo;upsert&rdquo;&#25805;&#20316;&mdash;&mdash;&#19968;&#31181;&#26082;&#26356;&#26032;&#24050;&#23384;&#22312;&#30340;&#35760;&#24405;&#65292;&#20063;&#25554;&#20837;&#26032;&#35760;&#24405;&#30340;&#25805;&#20316;&mdash;&mdash;&#24182;&#20171;&#32461;&#22914;&#20309;&#20351;&#29992;PHP Doctrine&#23454;&#29616;&#36825;&#19968;&#21151;&#33021;&#12290;<\/p><h3>Upsert is a database operation that updates or inserts data into a table. It combines the functionality of both UPDATE and INSERT statements in one query.<\/h3><p>&ldquo;Upsert&rdquo; &#26159;&ldquo;update&rdquo;&#21644;&ldquo;insert&rdquo;&#30340;&#32452;&#21512;&#35789;&#65292;&#29992;&#26469;&#25551;&#36848;&#19968;&#31181;&#25968;&#25454;&#24211;&#25805;&#20316;&#65292;&#35813;&#25805;&#20316;&#20250;&#26816;&#26597;&#35760;&#24405;&#26159;&#21542;&#22522;&#20110;&#21807;&#19968;&#32422;&#26463;&#23384;&#22312;&#65292;&#22914;&#26524;&#23384;&#22312;&#65292;&#21017;&#26356;&#26032;&#29616;&#26377;&#35760;&#24405;&#65307;&#21542;&#21017;&#25554;&#20837;&#26032;&#35760;&#24405;&#12290;&#36825;&#31181;&#25805;&#20316;&#22312;&#36991;&#20813;&#37325;&#22797;&#35760;&#24405;&#26041;&#38754;&#38750;&#24120;&#26377;&#29992;&#65292;&#27604;&#21333;&#29420;&#25191;&#34892;&#25554;&#20837;&#21644;&#26356;&#26032;&#25805;&#20316;&#26356;&#39640;&#25928;&#12290;<\/p><h3>&#20808;&#20915;&#26465;&#20214;<\/h3><p>&#20026;&#20102;&#20174;&#26412;&#25945;&#31243;&#20013;&#33719;&#24471;&#26368;&#22823;&#25910;&#30410;&#65292;&#35831;&#30830;&#20445;&#24744;&#20855;&#22791;&#20197;&#19979;&#26465;&#20214;&#65306;<\/p><p>&#22312;PHP&#39033;&#30446;&#20013;&#37197;&#32622;&#30340;Doctrine&#29615;&#22659;&#12290;<\/p><p>&#24403;&#21069;&#23433;&#35013;&#30340;PHP&#29256;&#26412;&#12290;<\/p><p>&#25968;&#25454;&#24211;&#21644;SQL&#30340;&#22522;&#30784;&#30693;&#35782;&#12290;<\/p><p>&#23545;PHP&#21644;&#38754;&#21521;&#23545;&#35937;&#32534;&#31243;&#30340;&#29702;&#35299;&#12290;<\/p><h2>&#30452;&#35273;&#20027;&#20041;&#26041;&#27861;<\/h2><p>&#22312;&#25105;&#20204;&#35752;&#35770;&#22914;&#20309;&#29992;Doctrine&#36827;&#34892;upsert&#25805;&#20316;&#20043;&#21069;&#65292;&#35753;&#25105;&#20204;&#20808;&#20102;&#35299;&#19968;&#19979;&#19968;&#31181;&#31616;&#21333;&#30340;&#26041;&#27861;&#65306;<\/p><pre><code>&lt;?php\n\n$entity = $entityManager-&gt;getRepository('User')-&gt;findOneBy(['email' =&gt; '[email&nbsp;protected]']);\n\nif ($entity) {\n    $entity-&gt;setName('Updated Name');\n    $entityManager-&gt;flush();\n} else {\n    $entity = new User();\n    $entity-&gt;setName('New Name');\n    $entity-&gt;setEmail('[email&nbsp;protected]');\n    $entityManager-&gt;persist($entity);\n    $entityManager-&gt;flush();\n}\n<\/code><\/pre><p>&#35813;&#20195;&#30721;&#26816;&#26597;&#32473;&#23450;&#30340;&#30005;&#23376;&#37038;&#20214;&#26159;&#21542;&#24050;&#23384;&#22312;&#65292;&#22914;&#26524;&#23384;&#22312;&#21017;&#26356;&#26032;&#21517;&#31216;&#65292;&#21542;&#21017;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;User&#23454;&#20307;&#24182;&#23558;&#20854;&#25345;&#20037;&#21270;&#21040;&#25968;&#25454;&#24211;&#20013;&#12290;<\/p><h2>Doctrine&#30340;Upsert&#25805;&#20316;<\/h2><p>&#19982;&#25163;&#21160;&#26816;&#26597;&#23454;&#20307;&#30340;&#23384;&#22312;&#19981;&#21516;&#65292;Doctrine &#25552;&#20379;&#20102;&#19968;&#31181;&#26356;&#20248;&#38597;&#30340;&#26041;&#27861;&#12290;<code>EntityManager<\/code>&#31867;&#30340;&#26041;&#27861;&#65288;methods&#65289;<code>persist()<\/code>and &#26159;&ldquo;&#24182;&#19988;&rdquo;&#30340;&#24847;&#24605;&#12290;<code>flush()<\/code>&#21487;&#20197;&#19968;&#36215;&#20351;&#29992;&#26469;&#23454;&#29616;&#26356;&#26032;&#25110;&#25554;&#20837;&#25805;&#20316;&#65288;upsert&#65289;&#12290;<\/p><p>&#28982;&#32780;&#65292;Doctrine &#27809;&#26377;&#19987;&#38376;&#30340; upsert &#26041;&#27861;&#65292;&#25152;&#20197;&#25105;&#20204;&#38656;&#35201;&#21033;&#29992; Doctrine &#25552;&#20379;&#30340;&#21807;&#19968;&#32422;&#26463;&#31995;&#32479;&#26469;&#30830;&#20445;&#22312;&#25554;&#20837;&#25110;&#26356;&#26032;&#26102;&#19981;&#20250;&#37325;&#22797;&#35760;&#24405;&#12290;<code>flush()<\/code>&#24403;&#35843;&#29992;&#26041;&#27861;&#26102;&#65292;MySQL&#65288;&#25110;&#20854;&#20182;&#25903;&#25345;&#30340;&#25968;&#25454;&#24211;&#24179;&#21488;&#65289;&#20250;&#30693;&#36947;&#38656;&#35201;&#25191;&#34892;INSERT&#25110;UPDATE&#25805;&#20316;&#12290;<\/p><p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#30830;&#20445;&#23454;&#20307;&#26377;&#19968;&#20010;&#21807;&#19968;&#30340;&#32422;&#26463;&#26465;&#20214;&#12290;&#20026;&#27492;&#65292;&#38656;&#35201;&#20462;&#25913;&#20320;&#30340;&#23454;&#20307;&#31867;&#12290;&#35753;&#25105;&#20204;&#32771;&#34385;&#19968;&#20010;&#21517;&#20026;&ldquo;&#29992;&#25143;&rdquo;&#30340;&#23454;&#20307;&#65292;&#20854;&#21807;&#19968;&#23383;&#27573;&#20026;&ldquo;&#30005;&#23376;&#37038;&#20214;&rdquo;&#65306;<\/p><pre><code>&lt;?php\n\nuse DoctrineORMMapping as ORM;\n\n\/**\n * @ORMEntity\n * @ORMUniqueConstraint(name=\"email_idx\", columns={\"email\"})\n *\/\nclass User\n{\n    \/\/ ...\n}\n?&gt;\n<\/code><\/pre><p>&#29616;&#22312;&#20320;&#24050;&#32463;&#35774;&#32622;&#20102;&#29420;&#29305;&#30340;&#32422;&#26463;&#65292;&#19968;&#20010;&#31616;&#21333;&#30340;<code>persist()<\/code>and &#26159;&ldquo;&#24182;&#19988;&rdquo;&#30340;&#24847;&#24605;&#12290;<code>flush()<\/code>&#36275;&#22815;&#20102;&#65306;<\/p><pre><code>&lt;?php\n\nuse DoctrineORMExceptionUniqueConstraintViolationException;\n\n$user = new User();\n$user-&gt;setName('John Doe');\n$user-&gt;setEmail('[email&nbsp;protected]');\n$entityManager-&gt;persist($user);\n\ntry {\n    $entityManager-&gt;flush();\n} catch (UniqueConstraintViolationException $e) {\n    \/\/ Handle exception: record already exists\n}\n<\/code><\/pre><p>&#19978;&#36848;&#22359;&#23558;&#25191;&#34892;&#26356;&#26032;&#25110;&#25554;&#20837;&#25805;&#20316;&#12290;&#22914;&#26524;&#29992;&#25143;&#37038;&#31665;&#20026; &#8216;[email&nbsp;protected]&#8217; &#30340;&#29992;&#25143;&#24050;&#32463;&#23384;&#22312;&#65292;Doctrine &#20250;&#25243;&#20986;&#24322;&#24120;&#12290;<code>UniqueConstraintViolationException<\/code>&#20320;&#21487;&#20197;&#25429;&#33719;&#36825;&#20010;&#24322;&#24120;&#24182;&#20915;&#23450;&#22914;&#20309;&#26356;&#26032;&#29616;&#26377;&#30340;&#35760;&#24405;&#12290;<\/p><h2>&#22788;&#29702;UniqueConstraintViolationException&#24322;&#24120;&#30340;&#24773;&#20917;&#12290;<\/h2><p>&#24403;&#25429;&#33719;&#24322;&#24120;&#26102;&#65292;&#20320;&#21487;&#20197;&#25214;&#21040;&#29616;&#26377;&#30340;&#23454;&#20307;&#24182;&#36827;&#34892;&#26356;&#26032;&#12290;&#36825;&#26159;&#19968;&#20010;&#20363;&#23376;&#65306;<\/p><pre><code>&lt;?php\n\nuse DoctrineORMExceptionUniqueConstraintViolationException;\n\n\/\/ ... try\/catch block from previous sample ...\ncatch (UniqueConstraintViolationException $e) {\n    $existingUser = $entityManager-&gt;getRepository('User')-&gt;findOneBy(['email' =&gt; '[email&nbsp;protected]']);\n    if ($existingUser) {\n        $existingUser-&gt;setName('John Doe Updated');\n        $entityManager-&gt;flush();\n    }\n}\n<\/code><\/pre><h2>&#20351;&#29992;Doctrine&#30340;&#26597;&#35810;&#26500;&#24314;&#22120;&#36827;&#34892;&#26356;&#26032;&#21644;&#25554;&#20837;&#25805;&#20316;&#65288;Upsert&#65289;<\/h2><p>&#21478;&#19968;&#31181;&#36873;&#25321;&#26159;&#20351;&#29992;Doctrine&#30340;&#26597;&#35810;&#26500;&#24314;&#22120;&#26469;&#32534;&#20889;&#19968;&#20010;&#31867;&#20284;&#20110;upsert&#30340;&#25805;&#20316;&#12290;&#20197;&#19979;&#26159;&#19968;&#31181;&#23454;&#29616;&#26041;&#24335;&#65306;<\/p><pre><code>&lt;?php\n\nuse DoctrineDBALException;\n\n$qb = $entityManager-&gt;getConnection()-&gt;createQueryBuilder();\n\n$result = $qb\n    -&gt;insert('User')\n    -&gt;values([\n        'name' =&gt; ':name',\n        'email' =&gt; ':email'\n    ])\n    -&gt;setParameter('name', 'John Doe')\n    -&gt;setParameter('email', '[email&nbsp;protected]')\n    -&gt;getSQL();\n\ntry {\n    $entityManager-&gt;getConnection()-&gt;executeStatement($result);\n} catch (Exception $e) {\n    \/\/ Handle exception: record already exists\n}\n<\/code><\/pre><p>&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;&#24744;&#23581;&#35797;&#21521;&#29992;&#25143;&#34920;&#20013;&#25554;&#20837;&#19968;&#26465;&#35760;&#24405;&#12290;&#22914;&#26524;&#35813;&#30005;&#23376;&#37038;&#20214;&#24050;&#23384;&#22312;&#65292;&#21017;&#20250;&#25243;&#20986;&#24322;&#24120;&#65292;&#25351;&#31034;&#22312;&#21807;&#19968;&#23383;&#27573; &#8217;email&#8217; &#19978;&#37325;&#22797;&#30340;&#26465;&#30446;&#12290;&#28982;&#21518;&#65292;&#24744;&#21487;&#20197;&#25429;&#33719;&#36825;&#20010;&#24322;&#24120;&#24182;&#30456;&#24212;&#22320;&#25191;&#34892;&#26356;&#26032;&#25805;&#20316;&#12290;<\/p><h2>&#32467;&#35770;<\/h2><p>&#25191;&#34892;Doctrine&#20013;&#30340;&#26356;&#26032;&#25110;&#25554;&#20837;&#25805;&#20316;&#26102;&#65292;&#38656;&#35201;&#22788;&#29702;&#19968;&#20123;&#20851;&#20110;&#21807;&#19968;&#32422;&#26463;&#30340;&#38382;&#39064;&#65292;&#20294;&#25353;&#29031;&#19978;&#36848;&#27169;&#24335;&#36827;&#34892;&#25805;&#20316;&#65292;&#20320;&#21487;&#20197;&#20445;&#25345;&#25968;&#25454;&#24211;&#20132;&#20114;&#30340;&#39640;&#25928;&#21644;&#26377;&#25928;&#12290;&#21033;&#29992;Doctrine&#30340;ORM&#21151;&#33021;&#30830;&#20445;&#25968;&#25454;&#30340;&#19968;&#33268;&#24615;&#65292;&#24182;&#36991;&#20813;&#37325;&#22797;&#19988;&#20887;&#20313;&#30340;SQL&#26597;&#35810;&#32534;&#20889;&#12290;&#38543;&#30528;&#23545;Doctrine&#29305;&#24615;&#30340;&#29087;&#24713;&#31243;&#24230;&#22686;&#21152;&#65292;&#20320;&#21487;&#33021;&#20250;&#21457;&#29616;&#26356;&#22810;&#36866;&#21512;&#24212;&#29992;&#38656;&#27714;&#30340;&#20248;&#38597;&#27169;&#24335;&#12290;<\/p><p>&#35760;&#24471;&#65292;&#20351;&#29992;&#25968;&#25454;&#24211;&#21644;ORM&#19981;&#20165;&#20165;&#26159;&#20102;&#35299;&#21487;&#29992;&#30340;&#24037;&#20855;&#65292;&#26356;&#26159;&#29702;&#35299;&#24212;&#29992;&#38656;&#27714;&#12290;&#39640;&#25928;&#22320;&#20351;&#29992;upsert&#25805;&#20316;&#21482;&#26159;&#26500;&#24314;&#21487;&#32500;&#25252;&#12289;&#25193;&#23637;&#24615;&#24378;&#30340;PHP&#19982;Doctrine&#24212;&#29992;&#31243;&#24207;&#30340;&#19968;&#37096;&#20998;&#22823;&#22270;&#12290;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&lt;?php<\/p>\n<p>\/\/ 1. &#21019;&#24314;&#23454;&#20307;&#31867;\nclass User extends DoctrineORMEntity\n{\n\/\/ &#35774;&#32622;&#20027;&#38190;&#31867;&#22411;&#20026;&#33258;&#22686;\npublic $id;<\/p>\n<pre><code>\/\/ &#29992;&#25143;&#21517;&#23383;&#27573;\npublic $username;\n\n\/\/ &#23494;&#30721;&#23383;&#27573;\npublic $password;<\/code><\/pre>\n<p>}<\/p>\n<p>\/\/ 2. &#21019;&#24314;&#25968;&#25454;&#24211;&#36830;&#25509;&#37197;&#32622;\n$connection = new PDO(&#8216;mysql:host=localhost;dbname=example&#8217;, &#8216;username&#8217;, &#8216;password&#8217;);<\/p>\n<p>\/\/ 3. &#21019;&#24314;ORM&#25805;&#20316;&#23545;&#35937;\n$userManager = new UserManager($connection);<\/p>\n<p>\/\/ 4. &#23454;&#29616;Upsert&#21151;&#33021;\n$userManager-&gt;upsert(new User, [&#8216;username&#8217; =&gt; &#8216;john&#8217;]);<\/p>\n<p>\/\/ &#25171;&#21360;&#32467;&#26524;\nvar_dump($userManager-&gt;getUsers());<\/p>\n<p>?&gt;<\/p>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#39318;&#20808;&#23450;&#20041;&#20102;&#19968;&#20010;&#21517;&#20026;<code>User<\/code>&#30340;&#23454;&#20307;&#31867;&#65292;&#23427;&#32487;&#25215;&#20102;<code>DoctrineORMEntity<\/code>&#12290;&#28982;&#21518;&#65292;&#25105;&#20204;&#21019;&#24314;&#20102;&#19968;&#20010;&#26032;&#30340;&#25968;&#25454;&#24211;&#36830;&#25509;&#24182;&#20351;&#29992;ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#26469;&#25805;&#20316;&#25968;&#25454;&#12290;<\/p>\n<p>&#25509;&#30528;&#65292;&#25105;&#20204;&#22312;ORM&#25805;&#20316;&#23545;&#35937;&#19978;&#23454;&#29616;&#20102;<code>upsert<\/code>&#26041;&#27861;&#12290;&#36825;&#20010;&#26041;&#27861;&#25509;&#25910;&#20004;&#20010;&#21442;&#25968;&#65306;&#19968;&#20010;&#26159;&#23454;&#20307;&#31867;&#23454;&#20363;&#21644;&#21478;&#19968;&#20010;&#26159;SQL&#26597;&#35810;&#23383;&#31526;&#20018;&#12290;&#26681;&#25454;&#25552;&#20379;&#30340;&#21442;&#25968;&#65292;<code>upsert<\/code>&#26041;&#27861;&#23558;&#20915;&#23450;&#26159;&#26356;&#26032;&#36824;&#26159;&#25554;&#20837;&#26032;&#35760;&#24405;&#12290;<\/p>\n<p>&#26368;&#21518;&#65292;&#25105;&#20204;&#25171;&#21360;&#20986;&#29992;&#25143;&#21015;&#34920;&#65292;&#21487;&#20197;&#30475;&#21040;&#25105;&#20204;&#30340;&#23454;&#20307;&#24050;&#32463;&#25104;&#21151;&#22320;&#34987;&#25554;&#20837;&#21040;&#25968;&#25454;&#24211;&#20013;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#22312; PHP &#20013;&#20351;&#29992; Doctrine &#36827;&#34892;&#25968;&#25454;&#25805;&#20316;&#26102;&#65292;Upsert&#65288;&#038;#21363..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1125","my1js","type-my1js","status-publish","hentry","my1js2nav-symfony"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/1125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=1125"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1125"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1125"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}