Skip to content
Snippets Groups Projects
SelectQueryBuilder.php 2.63 KiB
Newer Older
Josh Pollock's avatar
Josh Pollock committed
<?php


namespace calderawp\CalderaFormsQuery\Select;
Josh Pollock's avatar
Josh Pollock committed

Josh Pollock's avatar
Josh Pollock committed
use calderawp\CalderaFormsQuery\DoesQueries;
use calderawp\CalderaFormsQuery\MySqlBuilder;
use NilPortugues\Sql\QueryBuilder\Manipulation\Select;

abstract class SelectQueryBuilder implements DoesQueries, DoesSelectQuery
{
	const ASC = 'ASC';
	const DESC = 'DESC';

	/**
	 * @var MySqlBuilder
	 */
	private $builder;

	/**
	 * @var Select
	 */
	private $query;

	/**
	 * @var bool
	 */
	protected $isLike = false;

	/**
	 * @var string
	 */
Josh Pollock's avatar
Josh Pollock committed
	private $tableName;
Josh Pollock's avatar
Josh Pollock committed


	/**
	 * SelectQueryBuilder constructor.
	 * @param MySqlBuilder $builder Query builder
	 * @param string $tableName Name of table
	 */
Josh Pollock's avatar
Josh Pollock committed
	public function __construct(MySqlBuilder $builder, $tableName)
Josh Pollock's avatar
Josh Pollock committed
	{
		$this->builder = $builder;
		$this->tableName = $tableName;
	}

	/** @inheritdoc */
	public function getTableName()
	{
		return $this->tableName;
	}

	/** @inheritdoc */
	public function getBuilder()
	{
		return $this->builder;
	}


	/** @inheritdoc */
Josh Pollock's avatar
Josh Pollock committed
	public function getSelectQuery()
	{
Josh Pollock's avatar
Josh Pollock committed

		if (empty($this->query)) {
			$this->query = new \NilPortugues\Sql\QueryBuilder\Manipulation\Select($this->getTableName());
		}
		return $this->query;
	}

	/** @inheritdoc */
Josh Pollock's avatar
Josh Pollock committed
	public function getPreparedSql()
	{
		return $this->substituteValues($this->getBuilder()->write($this->getSelectQuery()));
Josh Pollock's avatar
Josh Pollock committed
	}

	/**
	 * @param string $column Column to orderby.
	 * @param bool $ascending Optional. To use ascending order? If false, descending is used. True is the default.
	 * @return $this
	 */
Josh Pollock's avatar
Josh Pollock committed
	public function addOrderBy($column, $ascending = true)
	{
Josh Pollock's avatar
Josh Pollock committed
		$order = $ascending ? self::ASC : self::DESC;
Josh Pollock's avatar
Josh Pollock committed
		$this->getSelectQuery()->orderBy($column, $order);
Josh Pollock's avatar
Josh Pollock committed
		return $this;
	}

	/**
	 * Generate query for where column is value
	 *
	 * @param string $column
	 * @param string $value
	 * @return $this
	 */
Josh Pollock's avatar
Josh Pollock committed
	protected function is($column, $value)
Josh Pollock's avatar
Josh Pollock committed
	{
		$this->getSelectQuery()
			->where()
Josh Pollock's avatar
Josh Pollock committed
			->equals($column, $value);
Josh Pollock's avatar
Josh Pollock committed
		return $this;
	}


	/**
	 * Replace all substitutions with actual values
	 *
	 * @param string $sql SQL query with substitutions
	 * @return string
	 */
Josh Pollock's avatar
Josh Pollock committed
	protected function substituteValues($sql)
Josh Pollock's avatar
Josh Pollock committed
	{
		$values = $this->builder->getValues();
Josh Pollock's avatar
Josh Pollock committed
		foreach ($values as $identifier => $value) {
			$values[$identifier] = $this->surroundValue($value);
Josh Pollock's avatar
Josh Pollock committed
		}
Josh Pollock's avatar
Josh Pollock committed
		return str_replace(array_keys($values), array_values($values), $sql);
Josh Pollock's avatar
Josh Pollock committed
	}

	/**
	 * @return string
	 */
	protected function getDeliminator()
	{
		return $this->isLike ? '%' : "'";
	}

	/**
	 * Surround one value with quotes or %
	 *
	 * @param string $value Value to surround
	 * @return string
	 */
Josh Pollock's avatar
Josh Pollock committed
	protected function surroundValue($value)
	{
Josh Pollock's avatar
Josh Pollock committed
		return "{$this->getDeliminator()}$value{$this->getDeliminator()}";
	}
Josh Pollock's avatar
Josh Pollock committed
}