@@ -220,6 +220,7 @@ public function upsert(
220220 string $ table ,
221221 array |object $ data ,
222222 array |string $ keys ,
223+ array |null $ updateFields = null ,
223224 array $ options = [],
224225 ): StatementInterface {
225226 $ keys = (array ) $ keys ;
@@ -236,10 +237,13 @@ public function upsert(
236237 $ table = (string ) $ query ->quoteName ($ table );
237238 $ data = TypeCast::toArray ($ data );
238239 $ allFields = array_keys ($ data );
239- $ valueFields = array_filter ($ allFields , fn ($ field ) => !in_array ($ field , $ keys , true ));
240+ // $valueFields = array_filter($allFields, fn($field) => !in_array($field, $keys, true));
240241
242+ $ updateFields ??= array_filter ($ allFields , fn ($ field ) => !in_array ($ field , $ keys , true ));
243+
244+ $ quotedUpdateFields = $ query ->qnMultiple ($ updateFields );
241245 $ quotedFields = $ query ->qnMultiple ($ allFields );
242- $ quotedValueFields = $ query ->qnMultiple ($ valueFields );
246+ // $quotedValueFields = $query->qnMultiple($valueFields);
243247 $ quotedKeys = $ query ->qnMultiple ($ keys );
244248
245249 $ columns = $ query ->clause ('() ' , $ quotedFields , ', ' );
@@ -256,39 +260,39 @@ public function upsert(
256260
257261 switch ($ platformName ) {
258262 case AbstractPlatform::MYSQL :
259- $ dupKeys = $ query ->clause ('' , [], ', ' );
263+ $ updateActions = $ query ->clause ('' , [], ', ' );
260264
261- foreach ($ quotedValueFields as $ key ) {
262- $ dupKeys ->append ("$ key = VALUES( $ key) " );
265+ foreach ($ quotedUpdateFields as $ key ) {
266+ $ updateActions ->append ("$ key = VALUES( $ key) " );
263267 }
264268
265269 $ query ->sql (
266270 <<<SQL
267271 INSERT INTO $ table $ columns
268272 VALUES $ values
269273 ON DUPLICATE KEY UPDATE
270- $ dupKeys
274+ $ updateActions
271275 SQL
272276 );
273277 break ;
274278
275279 case AbstractPlatform::POSTGRESQL :
276- $ dupKeys = $ query ->clause ('() ' , [], ', ' );
280+ $ updateActions = $ query ->clause ('() ' , [], ', ' );
277281
278282 foreach ($ quotedKeys as $ key ) {
279- $ dupKeys ->append ($ key );
283+ $ updateActions ->append ($ key );
280284 }
281285
282286 $ excludeKeys = $ query ->clause ('' , [], ', ' );
283287
284- foreach ($ quotedValueFields as $ key ) {
288+ foreach ($ quotedUpdateFields as $ key ) {
285289 $ excludeKeys ->append ("$ key = EXCLUDED. $ key " );
286290 }
287291
288292 $ query ->sql (
289293 <<<SQL
290294 INSERT INTO $ table $ columns
291- VALUES $ values ON CONFLICT $ dupKeys DO UPDATE SET
295+ VALUES $ values ON CONFLICT $ updateActions DO UPDATE SET
292296 $ excludeKeys
293297 SQL
294298 );
@@ -318,7 +322,7 @@ public function upsert(
318322
319323 $ updateSet = $ query ->clause ('' , [], ', ' );
320324
321- foreach ($ valueFields as $ k ) {
325+ foreach ($ updateFields as $ k ) {
322326 $ v = $ data [$ k ];
323327
324328 if ($ v instanceof RawWrapper) {
0 commit comments