public static function buildPredicates(array $input, $table = null, $inverse = false) { $predicates = []; foreach ($input as $key => $value) { if ($value === null || is_scalar($value) || $value instanceof ValueExpression) { $pred = $inverse ? new NotEqualPredicate() : new EqualPredicate(); $pred->setField(FieldExpression::createWithTable($key, $table)); if (!$value instanceof ValueExpression) { $value = ValueExpression::create($value); } $pred->setExpression($value); $predicates[] = $pred; } else { if ($value instanceof IPredicate) { $predicates[] = $value; } else { if (is_array($value)) { if (is_int($key)) { $predicates = array_merge($predicates, static::buildPredicates($value, $table, $inverse)); } else { if (static::_isControlKeyword($key)) { switch ($key) { case 'NOT': $predicates = array_merge($predicates, static::buildPredicates($value, $table, true)); break; case 'OR': $pred = new OrPredicateSet(); $pred->setPredicates(static::buildPredicates($value, $table, $inverse)); $predicates[] = $pred; break; case 'AND': $pred = new PredicateSet(); $pred->setPredicates(static::buildPredicates($value, $table, $inverse)); $predicates[] = $pred; break; } } else { $pred = $inverse ? new NotInPredicate() : new InPredicate(); $pred->setField(FieldExpression::createWithTable($key, $table)); $pred->setExpression(ArrayExpression::create($value)); $predicates[] = $pred; } } } } } } return $predicates; }
public function orWhere(...$expressions) { $currentSet = $this->_getCurrentSet(); $newSet = $this->_getNewSet($expressions); $finalSet = new OrPredicateSet(); $finalSet->addPredicate($currentSet); $finalSet->addPredicate($newSet); /** * @var $this IStatement * @var $where WhereClause */ $where = $this->getClause('WHERE'); $where->clearPredicates(); $where->addPredicate($finalSet); $this->addClause($where); return $this; }