Skip to content
Snippets Groups Projects
SelectQueryBuilder.php 2.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • Josh Pollock's avatar
    Josh Pollock committed
    <?php
    
    
    namespace calderawp\CalderaFormsQuery\Select;
    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
    	 */
    	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;
    	}
    
    	/** @inheritdoc */
    	public function getTableName()
    	{
    		return $this->tableName;
    	}
    
    	/** @inheritdoc */
    	public function getBuilder()
    	{
    		return $this->builder;
    	}
    
    
    	/** @inheritdoc */
    	public function getSelectQuery(){
    
    		if (empty($this->query)) {
    			$this->query = new \NilPortugues\Sql\QueryBuilder\Manipulation\Select($this->getTableName());
    
    		}
    		return $this->query;
    	}
    
    	/** @inheritdoc */
    	public function getPreparedSql(){
    		return $this->substituteValues( $this->getBuilder()->write( $this->getSelectQuery() ));
    	}
    
    	/**
    	 * @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
    	 */
    	public function addOrderBy( $column, $ascending = true ){
    		$order = $ascending ? self::ASC : self::DESC;
    		$this->getSelectQuery()->orderBy( $column, $order );
    		return $this;
    	}
    
    	/**
    	 * Generate query for where column is value
    	 *
    	 * @param string $column
    	 * @param string $value
    	 * @return $this
    	 */
    	protected function is($column, $value )
    	{
    		$this->getSelectQuery()
    			->where()
    			->equals( $column, $value );
    		return $this;
    	}
    
    
    	/**
    	 * Replace all substitutions with actual values
    	 *
    	 * @param string $sql SQL query with substitutions
    	 * @return string
    	 */
    	protected function substituteValues( $sql )
    	{
    		$values = $this->builder->getValues();
    		foreach ( $values as $identifier => $value ) {
    			$values[ $identifier ] = $this->surroundValue( $value );
    		}
    		return str_replace( array_keys( $values ), array_values( $values ), $sql ) ;
    	}
    
    	/**
    	 * @return string
    	 */
    	protected function getDeliminator()
    	{
    		return $this->isLike ? '%' : "'";
    	}
    
    	/**
    	 * Surround one value with quotes or %
    	 *
    	 * @param string $value Value to surround
    	 * @return string
    	 */
    	protected function surroundValue( $value ){
    		return "{$this->getDeliminator()}$value{$this->getDeliminator()}";
    	}
    
    
    
    
    }