/** * @param array $request * @return array */ public function make(array $request) { $output = ['data' => [], 'draw' => $request['draw'], 'recordsFiltered' => 0, 'recordsTotal' => 0]; /** * Order By */ if (isset($request['order'])) { for ($i = 0; $i < count($request['order']); ++$i) { $j = intval($request['order'][$i]['column']); if ($request['columns'][$j]['orderable'] != 'true') { continue; } $column = $request['columns'][$j]['data']; $sort = $request['order'][$i]['dir']; $this->query->addOrderBy($column, $sort); } } /** * Count All */ $temp = clone $this->query; $temp->resetQueryPart('select'); $temp->resetQueryPart('orderBy'); $temp->select("COUNT(*)"); $output['recordsTotal'] = $temp->execute()->fetchColumn(0); /** * Filter */ for ($i = 0; $i < count($request['columns']); ++$i) { if ($request['columns'][$i]['searchable'] != 'true') { continue; } $value = $request['columns'][$i]['search']['value']; if (strlen($value) > 0) { $column = $request['columns'][$i]['data']; $value = $this->query->getConnection()->quote("{$value}%"); $this->query->andHaving($this->query->expr()->like($column, $value)); } } /** * Search */ if (isset($request['search'])) { $value = $request['search']['value']; if (strlen($value) > 0) { for ($i = 0; $i < count($request['columns']); ++$i) { if ($request['columns'][$i]['searchable'] != 'true') { continue; } $column = $request['columns'][$i]['data']; $this->query->orHaving($this->query->expr()->like($column, ':search')); } $this->query->setParameter('search', "%{$value}%"); } } /** * Count Filtered */ $temp = clone $this->query; $temp->resetQueryPart('orderBy'); $output['recordsFiltered'] = $temp->execute()->rowCount(); /** * Limit */ if (isset($request['start'])) { $this->query->setFirstResult($request['start']); } if (isset($request['length'])) { $this->query->setMaxResults($request['length']); } /** * Fetch Results */ $output['data'] = $this->query->execute()->fetchAll(\PDO::FETCH_ASSOC); /** * Add Filter */ return $output; }
/** * @test */ public function andHavingDelegatesToConcreteQueryBuilder() { $this->concreteQueryBuilder->andHaving('uid=1', 'type=9')->shouldBeCalled()->willReturn($this->subject); $this->subject->andHaving('uid=1', 'type=9'); }
/** * Adds a restriction over the groups of the query, forming a logical * conjunction with any existing having restrictions. * * @param mixed $having The restriction to append. * * @return self */ public function andHaving($having) { $this->qb->andHaving($having); return $this; }
/** * Adds a restriction over the groups of the query, forming a logical * conjunction with any existing having restrictions. * * @param mixed,... $having The restriction to append. * * @return QueryBuilder This QueryBuilder instance. */ public function andHaving(...$having) : QueryBuilder { $this->concreteQueryBuilder->andHaving(...$having); return $this; }
/** * @param QueryBuilder $q * @param array $tables $tables[0] should be primary table * @param bool $innerJoinTables * @param null $whereExpression * @param null $having */ protected function applySearchQueryRelationship(QueryBuilder $q, array $tables, $innerJoinTables, $whereExpression = null, $having = null) { $primaryTable = $tables[0]; unset($tables[0]); $joinType = $innerJoinTables ? 'join' : 'leftJoin'; $this->useDistinctCount = true; $joins = $q->getQueryPart('join'); if (!array_key_exists($primaryTable['alias'], $joins)) { $q->{$joinType}($primaryTable['from_alias'], MAUTIC_TABLE_PREFIX . $primaryTable['table'], $primaryTable['alias'], $primaryTable['condition']); foreach ($tables as $table) { $q->{$joinType}($table['from_alias'], MAUTIC_TABLE_PREFIX . $table['table'], $table['alias'], $table['condition']); } if ($whereExpression) { $q->andWhere($whereExpression); } if ($having) { $q->andHaving($having); } $q->groupBy('l.id'); } }