/** * Persists changes in M:N relationships * * @param Entity $entity */ protected function persistHasManyChanges(Entity $entity) { $primaryKey = $this->mapper->getPrimaryKey($this->getTable()); $idField = $this->mapper->getEntityField($this->getTable(), $primaryKey); foreach ($entity->getHasManyRowDifferences() as $key => $difference) { list($columnReferencingSourceTable, $relationshipTable, $columnReferencingTargetTable) = explode(':', $key); $multiInsert = []; foreach ($difference as $value => $count) { if ($count > 0) { for ($i = 0; $i < $count; $i++) { $multiInsert[] = [$columnReferencingSourceTable => $entity->{$idField}, $columnReferencingTargetTable => $value]; } } else { $this->connection->query('DELETE FROM %n WHERE %n = ? AND %n = ? %lmt', $relationshipTable, $columnReferencingSourceTable, $entity->{$idField}, $columnReferencingTargetTable, $value, -$count); } } if (!empty($multiInsert)) { $this->connection->query('INSERT INTO %n %ex', $relationshipTable, $multiInsert); } } }