brokencube/automatorm

View on GitHub
src/Database/QueryBuilder/SubQuery.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * Query Builder - build SQL queries programatically
 *
 * @package Automatorm\Database
 */

namespace Automatorm\Database\QueryBuilder;

use Automatorm\Database\SqlString;
use Automatorm\Database\QueryBuilder;
use Automatorm\Database\Interfaces\Renderable;
use Automatorm\Exception;

class SubQuery extends Table
{
    protected $sub;
    protected $sql;
    protected $data;
    protected $alias;
    
    public function __construct($query, ?string $alias = 'subquery')
    {
        if ($query instanceof QueryBuilder) {
            $this->sub = clone $query;
        } elseif ($query instanceof SqlString) {
            $this->sql = (string) $query;
        } elseif (is_string($query)) {
            $this->sql = $query;
        } else {
            throw new Exception\QueryBuilder('Cannot parse subquery', $query);
        }
        
        $this->alias = $this->escape($alias);
    }

    public function __clone()
    {
        $this->sub = clone $this->sub;
    }

    public function render(QueryBuilder $query) : string
    {
        if ($this->sub) {
            [$this->sql, $this->data] = $this->sub->resolve();
        }
        $query->addData($this->data);
        return '(' . $this->sql . ') AS ' . $this->alias;
    }

    public function renderNoAlias(QueryBuilder $query) : string
    {
        if ($this->sub) {
            [$this->sql, $this->data] = $this->sub->resolve();
        }
        $query->addData($this->data);
        return '(' . $this->sql . ')';
    }
}