Skip to content
Snippets Groups Projects
QueryBuilder.php 3.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • Josh Pollock's avatar
    Josh Pollock committed
    <?php
    
    
    namespace calderawp\CalderaFormsQuery;
    
    
    Josh Pollock's avatar
    Josh Pollock committed
    use calderawp\CalderaFormsQuery\Exceptions\Exception;
    
    Josh Pollock's avatar
    Josh Pollock committed
    use NilPortugues\Sql\QueryBuilder\Manipulation\AbstractBaseQuery;
    
    
    Josh Pollock's avatar
    Josh Pollock committed
    /**
     * Class QueryBuilder
     *
     *
     * Used to create SQL queries, NOT run SQL queries
     */
    abstract class QueryBuilder implements CreatesSqlQueries
    
    Josh Pollock's avatar
    Josh Pollock committed
    {
    	const ASC = 'ASC';
    	const DESC = 'DESC';
    
    	/**
    	 * @var MySqlBuilder
    	 */
    	private $builder;
    
    	/**
    	 * @var bool
    	 */
    	protected $isLike = false;
    
    	/**
    	 * @var string
    	 */
    	private $tableName;
    
    
    	/**
    	 * SelectQueryBuilder constructor.
    	 * @param MySqlBuilder $builder Query builder
    	 * @param string $tableName Name of table
    	 */
    	public function __construct(MySqlBuilder $builder, $tableName)
    	{
    		$this->builder = $builder;
    		$this->tableName = $tableName;
    	}
    
    
    Josh Pollock's avatar
    Josh Pollock committed
    	/** @inheritdoc */
    	public function resetBuilder(MySqlBuilder $builder = null)
    	{
    
    Josh Pollock's avatar
    Josh Pollock committed
    		if (! $builder) {
    
    Josh Pollock's avatar
    Josh Pollock committed
    			$builder = new MySqlBuilder();
    		}
    
    		$this->builder = $builder;
    		return $this;
    	}
    
    
    Josh Pollock's avatar
    Josh Pollock committed
    	/**
    	 * @return AbstractBaseQuery
    	 */
    	abstract protected function getCurrentQuery();
    
    	/** @inheritdoc */
    	public function getTableName()
    	{
    		return $this->tableName;
    	}
    
    	/** @inheritdoc */
    	public function getBuilder()
    	{
    		return $this->builder;
    	}
    
    	/**
    	 * Add a where $column equals $value clause to query
    	 *
    	 * @param AbstractBaseQuery $queryBuilder
    	 * @param string $column
    	 * @param string $value
    	 * @return $this
    	 */
    
    Josh Pollock's avatar
    Josh Pollock committed
    	protected function addWhereEquals(AbstractBaseQuery $queryBuilder, $column, $value)
    
    Josh Pollock's avatar
    Josh Pollock committed
    	{
    		$queryBuilder
    			->where()
    			->equals($column, $value);
    		return $this;
    	}
    
    
    	/**
    	 * Replace all substitutions with actual values
    	 *
    	 * @param string $sql SQL query with substitutions
    	 * @return string
    
    Josh Pollock's avatar
    Josh Pollock committed
    	 * @throws Exception
    
    Josh Pollock's avatar
    Josh Pollock committed
    	 */
    	protected function substituteValues($sql)
    	{
    		$values = $this->getBuilder()->getValues();
    		foreach ($values as $identifier => $value) {
    
    Josh Pollock's avatar
    Josh Pollock committed
    			if (is_array( $value ) || is_object( $value ) ) {
    				continue;
    			} else {
    				$values[$identifier] = $this->surroundValue($value);
    			}
    
    Josh Pollock's avatar
    Josh Pollock committed
    		}
    		return str_replace(array_keys($values), array_values($values), $sql);
    	}
    
    	/**
    	 * @return string
    	 */
    	protected function getFirstDeliminator()
    	{
    		return $this->isLike ? "'%" : "'";
    	}
    
    	/**
    	 * @return string
    	 */
    	protected function getSecondDeliminator()
    	{
    
    Josh Pollock's avatar
    Josh Pollock committed
    		return $this->isLike ? "%'" : "'";
    	}
    
    Josh Pollock's avatar
    Josh Pollock committed
    
    	/**
    	 * Surround one value with quotes or %
    	 *
    	 * @param string $value Value to surround
    	 * @return string
    	 */
    	protected function surroundValue($value)
    	{
    		$value = "{$this->getFirstDeliminator()}$value{$this->getSecondDeliminator()}";
    
    Josh Pollock's avatar
    Josh Pollock committed
    		if (! $this->isLike) {
    
    Josh Pollock's avatar
    Josh Pollock committed
    			return $value;
    		}
    
    Josh Pollock's avatar
    Josh Pollock committed
    		return Escape::like($value);
    
    Josh Pollock's avatar
    Josh Pollock committed
    	}
    
    
    	/**
    	 * Generate query for where column is value
    	 *
    	 * @param string $column
    	 * @param string $value
    	 * @return $this
    	 */
    	protected function is($column, $value)
    	{
    
    Josh Pollock's avatar
    Josh Pollock committed
    		return $this->addWhereEquals($this->getCurrentQuery(), $column, $value);
    
    Josh Pollock's avatar
    Josh Pollock committed
    	}
    
    	/** @inheritdoc */
    	public function getPreparedSql()
    	{
    		return $this->substituteValues($this->getBuilder()->write($this->getCurrentQuery()));
    	}
    
    	 * Add a WHERE IN() $column
    
    Josh Pollock's avatar
    Josh Pollock committed
    	 *
    
    	 * @param array $entryIds Entries to search in
    	 * @param string $column Column name. Default is 'id'.
    
    Josh Pollock's avatar
    Josh Pollock committed
    	 * @return $this
    	 */
    
    	protected function in(array $entryIds, $column = 'id')
    
    Josh Pollock's avatar
    Josh Pollock committed
    	{
    		$this
    			->getCurrentQuery()
    			->where()
    
    			->in($column, $entryIds);
    
    Josh Pollock's avatar
    Josh Pollock committed
    		return $this;
    	}
    
    Josh Pollock's avatar
    Josh Pollock committed
    }