|
<?php |
|
|
|
namespace PicoDb\Builder; |
|
|
|
use PicoDb\Database; |
|
use PicoDb\Table; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConditionBuilder |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
private $db; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $values = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $conditions = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $orConditions = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $orConditionOffset = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function __construct(Database $db) |
|
{ |
|
$this->db = $db; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function build() |
|
{ |
|
return empty($this->conditions) ? '' : ' WHERE '.implode(' AND ', $this->conditions); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getValues() |
|
{ |
|
return $this->values; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function hasCondition() |
|
{ |
|
return ! empty($this->conditions); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function addCondition($sql) |
|
{ |
|
if ($this->orConditionOffset > 0) { |
|
$this->orConditions[$this->orConditionOffset]->withCondition($sql); |
|
} |
|
else { |
|
$this->conditions[] = $sql; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
public function beginOr() |
|
{ |
|
$this->orConditionOffset++; |
|
$this->orConditions[$this->orConditionOffset] = new OrConditionBuilder(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
public function closeOr() |
|
{ |
|
$condition = $this->orConditions[$this->orConditionOffset]->build(); |
|
$this->orConditionOffset--; |
|
|
|
if ($this->orConditionOffset > 0) { |
|
$this->orConditions[$this->orConditionOffset]->withCondition($condition); |
|
} else { |
|
$this->conditions[] = $condition; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function eq($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' = ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function neq($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' != ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function in($column, array $values) |
|
{ |
|
if (! empty($values)) { |
|
$this->addCondition($this->db->escapeIdentifier($column).' IN ('.implode(', ', array_fill(0, count($values), '?')).')'); |
|
$this->values = array_merge($this->values, $values); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function inSubquery($column, Table $subquery) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' IN ('.$subquery->buildSelectQuery().')'); |
|
$this->values = array_merge($this->values, $subquery->getConditionBuilder()->getValues()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function notIn($column, array $values) |
|
{ |
|
if (! empty($values)) { |
|
$this->addCondition($this->db->escapeIdentifier($column).' NOT IN ('.implode(', ', array_fill(0, count($values), '?')).')'); |
|
$this->values = array_merge($this->values, $values); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function notInSubquery($column, Table $subquery) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' NOT IN ('.$subquery->buildSelectQuery().')'); |
|
$this->values = array_merge($this->values, $subquery->getConditionBuilder()->getValues()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function like($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' '.$this->db->getDriver()->getOperator('LIKE').' ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function ilike($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' '.$this->db->getDriver()->getOperator('ILIKE').' ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function gt($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' > ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function gtSubquery($column, Table $subquery) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' > ('.$subquery->buildSelectQuery().')'); |
|
$this->values = array_merge($this->values, $subquery->getConditionBuilder()->getValues()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function lt($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' < ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function ltSubquery($column, Table $subquery) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' < ('.$subquery->buildSelectQuery().')'); |
|
$this->values = array_merge($this->values, $subquery->getConditionBuilder()->getValues()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function gte($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' >= ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function gteSubquery($column, Table $subquery) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' >= ('.$subquery->buildSelectQuery().')'); |
|
$this->values = array_merge($this->values, $subquery->getConditionBuilder()->getValues()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function lte($column, $value) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' <= ?'); |
|
$this->values[] = $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function lteSubquery($column, Table $subquery) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' <= ('.$subquery->buildSelectQuery().')'); |
|
$this->values = array_merge($this->values, $subquery->getConditionBuilder()->getValues()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function isNull($column) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' IS NULL'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function notNull($column) |
|
{ |
|
$this->addCondition($this->db->escapeIdentifier($column).' IS NOT NULL'); |
|
} |
|
} |
|
|