/** * @param QueryBuilder|NativeQueryBuilder $query * @param array $args * @return array */ public static function separateParameters($query, array $args) { for ($i = 0; array_key_exists($i, $args) && array_key_exists($i + 1, $args) && ($arg = $args[$i]); $i++) { if (!preg_match_all('~((\\:|\\?)(?P<name>[a-z0-9_]+))(?=(?:\\z|\\s|\\)))~i', $arg, $m)) { continue; } $repeatedArgs = []; foreach ($m['name'] as $l => $name) { if (isset($repeatedArgs[$name])) { continue; } $value = $args[++$i]; $type = NULL; if ($value instanceof \DateTime || $value instanceof \DateTimeImmutable) { $type = Type::DATETIME; } elseif (is_array($value)) { $type = Connection::PARAM_STR_ARRAY; } $query->setParameter($name, $value, $type); $repeatedArgs[$name] = TRUE; unset($args[$i]); } } return $args; }
/** * {@inheritdoc} * @return InlineParamsBuilder */ public function leftJoin($join, $alias, $conditionType = NULL, $condition = NULL, $indexBy = NULL) { if ($condition !== NULL) { $beforeArgs = array_slice(func_get_args(), 3); $args = array_values(Helpers::separateParameters($this, $beforeArgs)); if (count($beforeArgs) > count($args)) { $indexBy = count($args) === 2 ? $args[1] : NULL; $condition = $args[0]; } } return parent::leftJoin($join, $alias, $conditionType, $condition, $indexBy); }
/** * @param \Kdyby\Doctrine\QueryBuilder $qb * @return $this */ protected function applySelectFilters(QueryBuilder $qb) { if (count($this->selects) > 0) { $selects = $this->selects; $_selects = []; foreach ($selects as $alias => &$columns) { $columns = array_unique($columns); $columns = implode(',', $columns); $_selects[] = 'partial ' . $alias . '.{' . $columns . '}'; } $qb->select(implode(', ', $_selects)); } foreach ($this->selectFilters as $modifier) { $modifier($qb); } return $this; }
private function addOtherHours(QueryBuilder $qb) { $qb->addSelect('SEC_TO_TIME(SUM(TIME_TO_SEC(wh.otherHours))) AS other_hours'); }
/** * @param array $order_arr * @param QueryBuilder $query */ public function createOrders($order_arr, $query) { foreach ($order_arr as $by => $dir) { $query->addOrderBy($by, $dir); } }
/** * @param \Kdyby\Doctrine\QueryBuilder|\Kdyby\Doctrine\NativeQueryBuilder $qb * @param \Carrooi\NoGrid\Condition $condition * @throws \Carrooi\NoGrid\NotImplementedException */ public static function makeWhere($qb, Condition $condition) { if (!$qb instanceof QueryBuilder && !$qb instanceof NativeQueryBuilder) { throw new InvalidArgumentException(); } $column = $condition->getColumn(); $value = $condition->getValue(); if (!Strings::contains($column, '.')) { $column = current($qb->getRootAliases()) . '.' . $column; } $parameter = ':grid' . self::$parametersCount; $options = $condition->getOptions(); $lower = isset($options[Condition::CASE_INSENSITIVE]) && $options[Condition::CASE_INSENSITIVE]; if ($lower) { $column = 'lower(' . $column . ')'; $parameter = 'lower(' . $parameter . ')'; } if ($condition->getType() === Condition::SAME) { $qb->andWhere($column . ' = ' . $parameter); } elseif ($condition->getType() === Condition::NOT_SAME) { $qb->andWhere($column . ' != ' . $parameter); } elseif ($condition->getType() === Condition::IS_NULL) { $qb->andWhere($column . ' IS NULL'); } elseif ($condition->getType() === Condition::IS_NOT_NULL) { $qb->andWhere($column . ' IS NOT NULL'); } elseif ($condition->getType() === Condition::LIKE) { $qb->andWhere($column . ' LIKE ' . $parameter); } else { throw new NotImplementedException('Filtering condition is not implemented.'); } if (!in_array($condition->getType(), [Condition::IS_NULL, Condition::IS_NOT_NULL])) { $qb->setParameter('grid' . self::$parametersCount, $value); } self::$parametersCount++; }
/** * @param int $offset * @param int $limit */ public function limit($offset, $limit) { $this->qb->setFirstResult($offset)->setMaxResults($limit); }
/** * @param \Kdyby\Doctrine\QueryBuilder $qb * @return $this */ protected function applySelectFilters(QueryBuilder $qb) { if (count($this->selects) > 0) { $selects = []; foreach ($this->selects as $alias => $data) { $columns = array_unique($data['columns']); $distinct = $data['distinct'] ? 'DISTINCT ' : ''; if (empty($columns)) { $selects[] = $distinct . $alias; } else { $partial = []; foreach ($columns as $column => $columnAlias) { if (is_int($column)) { $partial[] = $columnAlias; } else { $selects[] = $distinct . $alias . '.' . $column . ' AS ' . $columnAlias; } } if (!empty($partial)) { if (!in_array('id', $partial)) { array_unshift($partial, 'id'); } $partial = implode(',', $partial); $selects[] = $distinct . 'PARTIAL ' . $alias . '.{' . $partial . '}' . ($data['alias'] !== null ? ' AS ' . $data['alias'] : ''); } } } $qb->select(implode(', ', $selects)); } foreach ($this->selectFilters as $modifier) { $modifier($qb); } return $this; }
/** * @param QueryBuilder $qb * @param int $page * @param int $limit */ protected function preparePagination(QueryBuilder $qb, $page, $limit) { $qb->setFirstResult($page * $limit - $limit)->setMaxResults($limit); }
/** * @param Kdyby\Persistence\Queryable $repository * @return \Doctrine\ORM\Query|\Doctrine\ORM\QueryBuilder */ protected function doCreateCountQuery(Kdyby\Persistence\Queryable $repository) { $this->queryBuilder->resetDQLParts(['select', 'orderBy', 'join'])->select('COUNT(rm.id) as total_count'); return $this->queryBuilder; }
/** * @param EntityManager * @param ISortableScope * @param QueryBuilder */ private function addScope(EntityManager $em, ISortableScope $sortable, QueryBuilder $qb) { $meta = $em->getClassMetadata(get_class($sortable)); $rc = new \ReflectionClass($sortable); foreach ($sortable->getSortableScope() as $field) { if ($meta->hasField($field) || $meta->hasAssociation($field)) { $rp = $rc->getProperty($field); $rp->setAccessible(TRUE); $qb->andWhere($qb->expr()->eq('e.' . $field, ':p_' . $field)); $qb->setParameter('p_' . $field, $rp->getValue($sortable)); } elseif ($meta->discriminatorColumn['name'] === $field) { if (($type = array_search(get_class($sortable), $meta->discriminatorMap)) === FALSE) { $type = get_class($sortable); } $qb->andWhere('e INSTANCE OF :discr_type')->setParameter('discr_type', $type); } else { throw new InvalidScopeException("Scope field {$field} is neither field, association nor discriminator"); } } }