Skip to content
Snippets Groups Projects
SelectQueryBuilder.php 2.63 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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
    }