Skip to content

Commit 8211a86

Browse files
authored
Merge pull request #5736 from iRedds/querybuilder-select-subquery
Feature: Subquery for SELECT
2 parents 5de4168 + bcb3607 commit 8211a86

File tree

5 files changed

+49
-0
lines changed

5 files changed

+49
-0
lines changed

system/Database/BaseBuilder.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,16 @@ public function selectCount(string $select = '', string $alias = '')
445445
return $this->maxMinAvgSum($select, $alias, 'COUNT');
446446
}
447447

448+
/**
449+
* Adds a subquery to the selection
450+
*/
451+
public function selectSubquery(BaseBuilder $subquery, string $as): self
452+
{
453+
$this->QBSelect[] = $this->buildSubquery($subquery, true, $as);
454+
455+
return $this;
456+
}
457+
448458
/**
449459
* SELECT [MAX|MIN|AVG|SUM|COUNT]()
450460
*

tests/system/Database/Builder/SelectTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,4 +246,17 @@ public function testSimpleSelectWithSQLSRV()
246246

247247
$this->assertSame($expected, str_replace("\n", ' ', $builder->getCompiledSelect()));
248248
}
249+
250+
public function testSelectSubquery()
251+
{
252+
$builder = new BaseBuilder('users', $this->db);
253+
$subquery = new BaseBuilder('countries', $this->db);
254+
255+
$subquery->select('name')->where('id', 1);
256+
$builder->select('name')->selectSubquery($subquery, 'country');
257+
258+
$expected = 'SELECT "name", (SELECT "name" FROM "countries" WHERE "id" = 1) AS "country" FROM "users"';
259+
260+
$this->assertSame($expected, str_replace("\n", ' ', $builder->getCompiledSelect()));
261+
}
249262
}

user_guide_src/source/changelogs/v4.2.0.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Enhancements
2424
- See :ref:`content-security-policy` for details.
2525
- New View Decorators allow modifying the generated HTML prior to caching.
2626
- Added Subqueries in the FROM section. See :ref:`query-builder-from-subquery`.
27+
- Added Subqueries in the SELECT section. See :ref:`query-builder-select`.
2728
- Added Validation Strict Rules. See :ref:`validation-traditional-and-strict-rules`.
2829
- Added new OCI8 driver for database.
2930
- It can access Oracle Database and supports SQL and PL/SQL statements.

user_guide_src/source/database/query_builder.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ method:
9191

9292
Please read about the ``where()`` method below for more information.
9393

94+
.. _query-builder-select:
95+
9496
Select
9597
======
9698

@@ -153,6 +155,13 @@ the resulting field.
153155

154156
.. literalinclude:: query_builder/014.php
155157

158+
**$builder->selectSubquery()**
159+
160+
Adds a subquery to the SELECT section.
161+
162+
.. literalinclude:: query_builder/098.php
163+
:lines: 2-
164+
156165
From
157166
====
158167

@@ -969,6 +978,15 @@ Class Reference
969978

970979
Adds a ``SELECT COUNT(field)`` clause to a query.
971980

981+
.. php:method:: selectSubquery(BaseBuilder $subquery, string $as)
982+
983+
:param string $subquery: Instance of BaseBuilder
984+
:param string $as: Alias for the resulting value name
985+
:returns: ``BaseBuilder`` instance (method chaining)
986+
:rtype: ``BaseBuilder``
987+
988+
Adds a subquery to the selection
989+
972990
.. php:method:: distinct([$val = true])
973991
974992
:param bool $val: Desired value of the "distinct" flag
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
$subquery = $db->table('countries')->select('name')->where('id', 1);
4+
$builder = $db->table('users')->select('name')->selectSubquery($subquery, 'country');
5+
$query = $builder->get();
6+
7+
// Produces: SELECT `name`, (SELECT `name` FROM `countries` WHERE `id` = 1) AS `country` FROM `users`

0 commit comments

Comments
 (0)