diff --git a/src/ORM/DataQuery.php b/src/ORM/DataQuery.php index b37f1669938..4ec928a71a1 100644 --- a/src/ORM/DataQuery.php +++ b/src/ORM/DataQuery.php @@ -831,6 +831,26 @@ public function leftJoin($table, $onClause, $alias = null, $order = 20, $paramet return $this; } + /** + * Add a RIGHT JOIN clause to this query. + * + * @param string $table The unquoted table to join to. + * @param string $onClause The filter for the join (escaped SQL statement). + * @param string $alias An optional alias name (unquoted) + * @param int $order A numerical index to control the order that joins are added to the query; lower order values + * will cause the query to appear first. The default is 20, and joins created automatically by the + * ORM have a value of 10. + * @param array $parameters Any additional parameters if the join is a parameterised subquery + * @return $this + */ + public function rightJoin($table, $onClause, $alias = null, $order = 20, $parameters = []) + { + if ($table) { + $this->query->addRightJoin($table, $onClause, $alias, $order, $parameters); + } + return $this; + } + /** * Prefix of all joined table aliases. E.g. ->filter('Banner.Image.Title)' * Will join the Banner, and then Image relations diff --git a/src/ORM/Queries/SQLConditionalExpression.php b/src/ORM/Queries/SQLConditionalExpression.php index 55d6ae5c297..b5cf12f1c11 100644 --- a/src/ORM/Queries/SQLConditionalExpression.php +++ b/src/ORM/Queries/SQLConditionalExpression.php @@ -136,17 +136,25 @@ public function useConjunction() */ public function addLeftJoin($table, $onPredicate, $tableAlias = '', $order = 20, $parameters = []) { - if (!$tableAlias) { - $tableAlias = $table; - } - $this->from[$tableAlias] = [ - 'type' => 'LEFT', - 'table' => $table, - 'filter' => [$onPredicate], - 'order' => $order, - 'parameters' => $parameters - ]; - return $this; + return $this->addJoin($table, 'LEFT', $onPredicate, $tableAlias, $order, $parameters); + } + + /** + * Add a RIGHT JOIN criteria to the tables list. + * + * @param string $table Unquoted table name + * @param string $onPredicate The "ON" SQL fragment in a "RIGHT JOIN ... AS ... ON ..." statement, Needs to be valid + * (quoted) SQL. + * @param string $tableAlias Optional alias which makes it easier to identify and replace joins later on + * @param int $order A numerical index to control the order that joins are added to the query; lower order values + * will cause the query to appear first. The default is 20, and joins created automatically by the + * ORM have a value of 10. + * @param array $parameters Any additional parameters if the join is a parameterized subquery + * @return $this Self reference + */ + public function addRightJoin($table, $onPredicate, $tableAlias = '', $order = 20, $parameters = []) + { + return $this->addJoin($table, 'RIGHT', $onPredicate, $tableAlias, $order, $parameters); } /** @@ -163,12 +171,20 @@ public function addLeftJoin($table, $onPredicate, $tableAlias = '', $order = 20, * @return $this Self reference */ public function addInnerJoin($table, $onPredicate, $tableAlias = null, $order = 20, $parameters = []) + { + return $this->addJoin($table, 'INNER', $onPredicate, $tableAlias, $order, $parameters); + } + + /** + * Add a JOIN criteria + */ + private function addJoin($table, $type, $onPredicate, $tableAlias = null, $order = 20, $parameters = []): static { if (!$tableAlias) { $tableAlias = $table; } $this->from[$tableAlias] = [ - 'type' => 'INNER', + 'type' => $type, 'table' => $table, 'filter' => [$onPredicate], 'order' => $order,