@@ -377,8 +377,8 @@ public function iterateQuery($query, array $parameters = null, $batchSize = 500)
377
377
* @param string $table
378
378
* @param string $owningColumnName
379
379
* @param string $inverseColumnName
380
- * @param int $owningID
381
- * @param int[] $inverseIDs
380
+ * @param mixed $owningID
381
+ * @param array $inverseIDs
382
382
*/
383
383
public function updateManyToMany ($ table , $ owningColumnName , $ inverseColumnName , $ owningID , array $ inverseIDs )
384
384
{
@@ -394,30 +394,35 @@ public function updateManyToMany($table, $owningColumnName, $inverseColumnName,
394
394
{
395
395
throw new InvalidArgumentException ('Parameter $inverseColumnName cannot be NULL, empty string ("") or only white-space characters. ' );
396
396
}
397
- if (!Scalars::tryParse ($ owningID , $ owningID , Scalars::INTEGER ))
398
- {
399
- throw new InvalidArgumentException ('Parameter $owningID has to be an integer. ' );
400
- }
401
- if (empty ($ inverseIDs ))
402
- {
403
- throw new InvalidArgumentException ('Parameter $inverseIDs has to be non-empty array containing integer values. ' );
404
- }
405
- $ originalInverseIDs = Arrays::select ($ this ->fetchAll ("SELECT $ inverseColumnName FROM $ table WHERE $ owningColumnName = $ owningID " ), "[ $ inverseColumnName] " );
397
+ $ originalInverseIDs = $ this ->fetchAll ("SELECT $ inverseColumnName FROM $ table WHERE $ owningColumnName = :owningId " , ["owningId " => $ owningID ]);
398
+ $ originalInverseIDs = Arrays::select ($ originalInverseIDs , "[ $ inverseColumnName] " );
406
399
$ IDsToDelete = array_diff ($ originalInverseIDs , $ inverseIDs );
407
- $ IDsToAdd = array_merge ($ inverseIDs , $ originalInverseIDs );
400
+ $ IDsToAdd = array_diff ($ inverseIDs , $ originalInverseIDs );
408
401
$ query = "START TRANSACTION; " ;
402
+ $ parameters = ["owningId " => $ owningID ];
409
403
if (!empty ($ IDsToDelete ))
410
404
{
411
- $ query .= "DELETE FROM $ table WHERE $ owningColumnName = $ owningID AND $ inverseColumnName IN ( " . Strings::join ($ IDsToDelete , ", " ) . "); " ;
405
+ $ query .= "DELETE FROM $ table WHERE $ owningColumnName = :owningId AND $ inverseColumnName IN ( " ;
406
+ $ i = 0 ;
407
+ foreach ($ IDsToDelete as $ deleteID )
408
+ {
409
+ $ query .= ":inverseId_delete_ $ i, " ;
410
+ $ parameters ["inverseId_delete_ $ i " ] = $ deleteID ;
411
+ $ i ++;
412
+ }
413
+ $ query = Strings::remove ($ query , Strings::length ($ query ) - 2 ) . "); " ;
412
414
}
413
415
if (!empty ($ IDsToAdd ))
414
416
{
417
+ $ i = 0 ;
415
418
foreach ($ IDsToAdd as $ inverseID )
416
419
{
417
- $ query .= "INSERT INTO $ table ( $ owningColumnName, $ inverseColumnName) VALUES ( $ owningID, $ inverseID); " ;
420
+ $ query .= "INSERT INTO $ table ( $ owningColumnName, $ inverseColumnName) VALUES (:owningId, :inverseId_insert_ $ i); " ;
421
+ $ parameters ["inverseId_insert_ $ i " ] = $ inverseID ;
422
+ $ i ++;
418
423
}
419
424
}
420
- $ query = "COMMIT; " ;
425
+ $ query . = "COMMIT; " ;
421
426
if (!empty ($ IDsToDelete ) || !empty ($ IDsToAdd ))
422
427
{
423
428
$ this ->executeNonQuery ($ query );
0 commit comments