<?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()}"; } }