From 58c104a6e8029049f71301aa4a1de65674fe1a5b Mon Sep 17 00:00:00 2001 From: Benjamin Morel Date: Sat, 18 Jan 2020 10:33:19 +0100 Subject: [PATCH] Introduce Join class in QueryBuilder --- lib/Doctrine/DBAL/Query/Join.php | 46 ++++++++++++++++++++++++ lib/Doctrine/DBAL/Query/QueryBuilder.php | 42 ++++++++-------------- 2 files changed, 60 insertions(+), 28 deletions(-) create mode 100644 lib/Doctrine/DBAL/Query/Join.php diff --git a/lib/Doctrine/DBAL/Query/Join.php b/lib/Doctrine/DBAL/Query/Join.php new file mode 100644 index 00000000000..595b85bba74 --- /dev/null +++ b/lib/Doctrine/DBAL/Query/Join.php @@ -0,0 +1,46 @@ +type = $type; + $this->table = $table; + $this->alias = $alias; + $this->condition = $condition; + } + + public static function inner(string $table, string $alias, ?string $condition) : Join + { + return new self('INNER', $table, $alias, $condition); + } + + public static function left(string $table, string $alias, ?string $condition) : Join + { + return new self('LEFT', $table, $alias, $condition); + } + + public static function right(string $table, string $alias, ?string $condition) : Join + { + return new self('RIGHT', $table, $alias, $condition); + } +} diff --git a/lib/Doctrine/DBAL/Query/QueryBuilder.php b/lib/Doctrine/DBAL/Query/QueryBuilder.php index c6e55ea824f..00eba6b5531 100644 --- a/lib/Doctrine/DBAL/Query/QueryBuilder.php +++ b/lib/Doctrine/DBAL/Query/QueryBuilder.php @@ -20,7 +20,6 @@ use function is_array; use function is_object; use function key; -use function strtoupper; use function substr; /** @@ -426,7 +425,7 @@ public function add(string $sqlPartName, $sqlPart, bool $append = false) : self foreach ($sqlPart as $part) { $this->sqlParts[$sqlPartName][] = $part; } - } elseif ($isArray && is_array($sqlPart[key($sqlPart)])) { + } elseif ($isArray && (is_array($sqlPart[key($sqlPart)]) || is_object($sqlPart[key($sqlPart)]))) { $key = key($sqlPart); $this->sqlParts[$sqlPartName][$key][] = $sqlPart[$key]; } elseif ($isMultiple) { @@ -673,12 +672,7 @@ public function join(string $fromAlias, string $join, string $alias, ?string $co public function innerJoin(string $fromAlias, string $join, string $alias, ?string $condition = null) { return $this->add('join', [ - $fromAlias => [ - 'joinType' => 'inner', - 'joinTable' => $join, - 'joinAlias' => $alias, - 'joinCondition' => $condition, - ], + $fromAlias => Join::inner($join, $alias, $condition), ], true); } @@ -702,12 +696,7 @@ public function innerJoin(string $fromAlias, string $join, string $alias, ?strin public function leftJoin(string $fromAlias, string $join, string $alias, ?string $condition = null) { return $this->add('join', [ - $fromAlias => [ - 'joinType' => 'left', - 'joinTable' => $join, - 'joinAlias' => $alias, - 'joinCondition' => $condition, - ], + $fromAlias => Join::left($join, $alias, $condition), ], true); } @@ -731,12 +720,7 @@ public function leftJoin(string $fromAlias, string $join, string $alias, ?string public function rightJoin(string $fromAlias, string $join, string $alias, ?string $condition = null) { return $this->add('join', [ - $fromAlias => [ - 'joinType' => 'right', - 'joinTable' => $join, - 'joinAlias' => $alias, - 'joinCondition' => $condition, - ], + $fromAlias => Join::right($join, $alias, $condition), ], true); } @@ -770,7 +754,7 @@ public function set(string $key, string $value) * ->from('counters', 'c') * ->where('c.id = ?'); * - * // You can optionally programatically build and/or expressions + * // You can optionally programmatically build and/or expressions * $qb = $conn->createQueryBuilder(); * * $or = $qb->expr()->orx(); @@ -1315,17 +1299,19 @@ private function getSQLForJoins(string $fromAlias, array &$knownAliases) : strin if (isset($this->sqlParts['join'][$fromAlias])) { foreach ($this->sqlParts['join'][$fromAlias] as $join) { - if (array_key_exists($join['joinAlias'], $knownAliases)) { - throw NonUniqueAlias::new($join['joinAlias'], array_keys($knownAliases)); + /** @var Join $join */ + if (array_key_exists($join->alias, $knownAliases)) { + throw NonUniqueAlias::new($join->alias, array_keys($knownAliases)); } - $sql .= ' ' . strtoupper($join['joinType']) - . ' JOIN ' . $join['joinTable'] . ' ' . $join['joinAlias'] - . ' ON ' . ((string) $join['joinCondition']); - $knownAliases[$join['joinAlias']] = true; + $sql .= ' ' . $join->type + . ' JOIN ' . $join->table . ' ' . $join->alias + . ' ON ' . ((string) $join->condition); + $knownAliases[$join->alias] = true; } foreach ($this->sqlParts['join'][$fromAlias] as $join) { - $sql .= $this->getSQLForJoins($join['joinAlias'], $knownAliases); + /** @var Join $join */ + $sql .= $this->getSQLForJoins($join->alias, $knownAliases); } }