Skip to content

Commit

Permalink
Fix MSSQL/Oracle missing fields in group hack (#988)
Browse files Browse the repository at this point in the history
  • Loading branch information
mvorisek committed Apr 24, 2022
1 parent 955c3d8 commit 7ede464
Showing 1 changed file with 19 additions and 9 deletions.
28 changes: 19 additions & 9 deletions src/Persistence/Sql.php
Original file line number Diff line number Diff line change
Expand Up @@ -342,19 +342,29 @@ public function initQueryConditions(Model $model, Query $query): void
// add entity ID to scope to allow easy traversal
if ($model->isEntity() && $model->id_field && $model->getId() !== null) {
$query->group($model->getField($model->id_field));
$this->fixMssqlOracleMissingFieldsInGroup($query);
$this->fixMssqlOracleMissingFieldsInGroup($model, $query);
$query->having($model->getField($model->id_field), $model->getId());
}
}

private function fixMssqlOracleMissingFieldsInGroup(Query $query): void
private function fixMssqlOracleMissingFieldsInGroup(Model $model, Query $query): void
{
if (($this->getDatabasePlatform() instanceof SQLServerPlatform
|| $this->getDatabasePlatform() instanceof OraclePlatform)
&& count($query->args['group'] ?? []) > 0) {
foreach ($query->args['field'] ?? [] as $field) {
if ($field instanceof Field) {
$query->group($field);
|| $this->getDatabasePlatform() instanceof OraclePlatform)) {
$isIdFieldInGroup = false;
foreach ($query->args['group'] ?? [] as $v) {
if ($model->id_field && $v === $model->getField($model->id_field)) {
$isIdFieldInGroup = true;

break;
}
}

if ($isIdFieldInGroup) {
foreach ($query->args['field'] ?? [] as $field) {
if ($field instanceof Field) {
$query->group($field);
}
}
}
}
Expand Down Expand Up @@ -426,7 +436,7 @@ public function action(Model $model, string $type, array $args = [])
} else {
$query->reset('field')->field($field);
}
$this->fixMssqlOracleMissingFieldsInGroup($query);
$this->fixMssqlOracleMissingFieldsInGroup($model, $query);

if ($model->isEntity() && $model->isLoaded()) {
$idRaw = $this->typecastSaveField($model->getField($model->id_field), $model->getId());
Expand Down Expand Up @@ -458,7 +468,7 @@ public function action(Model $model, string $type, array $args = [])
} else {
$query->reset('field')->field($query->expr($expr, [$field]));
}
$this->fixMssqlOracleMissingFieldsInGroup($query);
$this->fixMssqlOracleMissingFieldsInGroup($model, $query);

return $query;
default:
Expand Down

0 comments on commit 7ede464

Please sign in to comment.