for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace Kir\MySQL\Builder\Traits;
use Kir\MySQL\Builder\Select;
trait UnionBuilder {
use AbstractDB;
/** @var array<int, array{''|'ALL', string|Select}> */
array<int, array{''|'ALL', string|Select}>
6
private $unions = [];
/**
* @param string|Select ...$queries
* @return $this
*/
public function union(...$queries) {
foreach($queries as $query) {
$this->unions[] = ['', $query];
}
return $this;
public function unionAll(...$queries) {
$this->unions[] = ['ALL', $query];
* @param string $query
* @return string
protected function buildUnions(string $query): string {
$wrap = static function ($query) {
$query = trim($query);
$query = implode("\n\t", explode("\n", $query));
return sprintf("(\n\t%s\n)", $query);
};
$queries = [$wrap($query)];
foreach($this->unions as $unionQuery) {
if($unionQuery[0] === 'ALL') {
$queries[] = 'UNION ALL';
} else {
$queries[] = 'UNION';
$queries[] = $wrap($unionQuery[1]);
if(count($queries) > 1) {
return implode(' ', $queries);
return $query;