From 984425879072e2ad4570c30d57440d5d5a75b3b3 Mon Sep 17 00:00:00 2001 From: Oleg <132598889+SavageDays@users.noreply.github.com> Date: Sat, 13 Apr 2024 22:12:49 +0300 Subject: [PATCH] Multiple queries to tables have been replaced with a single one (#612) --- src/EventListener/LogRevisionsListener.php | 55 ++++++++++++---------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/EventListener/LogRevisionsListener.php b/src/EventListener/LogRevisionsListener.php index 1fb85c82..71917d0e 100644 --- a/src/EventListener/LogRevisionsListener.php +++ b/src/EventListener/LogRevisionsListener.php @@ -115,6 +115,9 @@ public function postFlush(PostFlushEventArgs $eventArgs): void continue; } + $sql = 'UPDATE '.$this->config->getTableName($meta).' '; + $params = $types = []; + foreach ($updateData[$meta->table['name']] as $column => $value) { $field = $meta->getFieldName($column); $fieldName = $meta->getFieldForColumn($column); @@ -128,13 +131,15 @@ public function postFlush(PostFlushEventArgs $eventArgs): void } } - $sql = 'UPDATE '.$this->config->getTableName($meta).' '. - 'SET '.$field.' = '.$placeholder.' '. - 'WHERE '.$this->config->getRevisionFieldName().' = ? '; + if ($column === array_key_first($updateData[$meta->table['name']])) { + $sql .= 'SET '; + } else { + $sql = trim($sql).', '; + } - $params = [$value, $this->getRevisionId($conn)]; + $sql .= $field.' = '.$placeholder.' '; - $types = []; + $params[] = $value; if (\array_key_exists($column, $meta->fieldNames)) { $types[] = $meta->getTypeOfField($fieldName); @@ -161,29 +166,31 @@ public function postFlush(PostFlushEventArgs $eventArgs): void $types[] = $type; } + } - $types[] = $this->config->getRevisionIdFieldType(); - - foreach ($meta->identifier as $idField) { - if (isset($meta->fieldMappings[$idField])) { - $columnName = $meta->fieldMappings[$idField]['columnName']; - $types[] = $meta->fieldMappings[$idField]['type']; - } elseif (isset($meta->associationMappings[$idField]['joinColumns'])) { - $columnName = $meta->associationMappings[$idField]['joinColumns'][0]['name']; - $types[] = $meta->associationMappings[$idField]['type']; - } else { - throw new \RuntimeException('column name not found for'.$idField); - } - - $reflField = $meta->reflFields[$idField]; - \assert(null !== $reflField); - $params[] = $reflField->getValue($entity); - - $sql .= ' AND '.$columnName.' = ?'; + $sql .= 'WHERE '.$this->config->getRevisionFieldName().' = ? '; + $params[] = $this->getRevisionId($conn); + $types[] = $this->config->getRevisionIdFieldType(); + + foreach ($meta->identifier as $idField) { + if (isset($meta->fieldMappings[$idField])) { + $columnName = $meta->fieldMappings[$idField]['columnName']; + $types[] = $meta->fieldMappings[$idField]['type']; + } elseif (isset($meta->associationMappings[$idField]['joinColumns'])) { + $columnName = $meta->associationMappings[$idField]['joinColumns'][0]['name']; + $types[] = $meta->associationMappings[$idField]['type']; + } else { + throw new \RuntimeException('column name not found for'.$idField); } - $em->getConnection()->executeQuery($sql, $params, $types); + $reflField = $meta->reflFields[$idField]; + \assert(null !== $reflField); + $params[] = $reflField->getValue($entity); + + $sql .= ' AND '.$columnName.' = ?'; } + + $em->getConnection()->executeQuery($sql, $params, $types); } foreach ($this->deferredChangedManyToManyEntityRevisionsToPersist as $deferredChangedManyToManyEntityRevisionToPersist) {