diff --git a/system/Database/BaseBuilder.php b/system/Database/BaseBuilder.php index a3fc6c7563..92d3594556 100644 --- a/system/Database/BaseBuilder.php +++ b/system/Database/BaseBuilder.php @@ -445,6 +445,22 @@ class BaseBuilder return $this->maxMinAvgSum($select, $alias, 'COUNT'); } + /** + * Adds a subquery to the selection + * + * @return static + */ + public function selectSubquery(BaseBuilder $subquery, string $as) + { + if (! $this->isSubquery($subquery)) { + throw new DatabaseException('The BaseBuilder::selectSubquery method expects a BaseBuilder instance'); + } + + $this->QBSelect[] = $this->buildSubquery($subquery, true, $as); + + return $this; + } + /** * SELECT [MAX|MIN|AVG|SUM|COUNT]() * diff --git a/tests/system/Database/Builder/SelectTest.php b/tests/system/Database/Builder/SelectTest.php index 7a9e757022..97460f0010 100644 --- a/tests/system/Database/Builder/SelectTest.php +++ b/tests/system/Database/Builder/SelectTest.php @@ -246,4 +246,17 @@ final class SelectTest extends CIUnitTestCase $this->assertSame($expected, str_replace("\n", ' ', $builder->getCompiledSelect())); } + + public function testSelectSubquery() + { + $builder = new BaseBuilder('users', $this->db); + $subquery = new BaseBuilder('countries', $this->db); + + $subquery->select('name')->where('id', 1); + $builder->select('name')->selectSubquery($subquery, 'country'); + + $expected = 'SELECT "name", (SELECT "name" FROM "countries" WHERE "id" = 1) AS "country" FROM "users"'; + + $this->assertSame($expected, str_replace("\n", ' ', $builder->getCompiledSelect())); + } } diff --git a/user_guide_src/source/changelogs/v4.2.0.rst b/user_guide_src/source/changelogs/v4.2.0.rst index f22ddae1aa..a1660d8cf8 100644 --- a/user_guide_src/source/changelogs/v4.2.0.rst +++ b/user_guide_src/source/changelogs/v4.2.0.rst @@ -24,6 +24,7 @@ Enhancements - See :ref:`content-security-policy` for details. - New View Decorators allow modifying the generated HTML prior to caching. - Added Subqueries in the FROM section. See :ref:`query-builder-from-subquery`. +- Added Subqueries in the SELECT section. - Added Validation Strict Rules. See :ref:`validation-traditional-and-strict-rules`. - Added new OCI8 driver for database. - It can access Oracle Database and supports SQL and PL/SQL statements. diff --git a/user_guide_src/source/database/query_builder.rst b/user_guide_src/source/database/query_builder.rst index 1969620b63..0a1861e238 100755 --- a/user_guide_src/source/database/query_builder.rst +++ b/user_guide_src/source/database/query_builder.rst @@ -167,6 +167,13 @@ the resulting field. .. literalinclude:: query_builder/014.php :lines: 2- +**$builder->selectSubquery()** + +Adds a subquery to the SELECT section. + +.. literalinclude:: query_builder/098.php + :lines: 2- + From ==== @@ -1066,6 +1073,15 @@ Class Reference Adds a ``SELECT COUNT(field)`` clause to a query. +.. php:method:: selectSubquery(BaseBuilder $subquery, string $as) + + :param string $subquery: Instance of BaseBuilder + :param string $as: Alias for the resulting value name + :returns: ``BaseBuilder`` instance (method chaining) + :rtype: ``BaseBuilder`` + + Adds a subquery to the selection + .. php:method:: distinct([$val = true]) :param bool $val: Desired value of the "distinct" flag diff --git a/user_guide_src/source/database/query_builder/098.php b/user_guide_src/source/database/query_builder/098.php new file mode 100644 index 0000000000..96d1d0d902 --- /dev/null +++ b/user_guide_src/source/database/query_builder/098.php @@ -0,0 +1,7 @@ +table('countries')->select('name')->where('id', 1); +$builder = $db->table('users')->select('name')->selectSubquery($subquery, 'country'); +$query = $builder->get(); + +// Produces: SELECT `name`, (SELECT `name` FROM `countries` WHERE `id` = 1) AS `country` FROM `users` \ No newline at end of file