params); } /** * Clone an existing query for a subsequent modifying and building. */ public function clone(Select $query) : self { $this->cloneInternal($query); return $this; } /** * Set to return STH collection. Recommended for fetching large number of records. * * @todo Remove. */ public function sth() : self { $this->params['returnSthCollection'] = true; return $this; } /** * Apply OFFSET and LIMIT. */ public function limit(?int $offset = null, ?int $limit = null) : self { $this->params['offset'] = $offset; $this->params['limit'] = $limit; return $this; } /** * Specify SELECT. Columns and expressions to be selected. If not called, then all entity attributes will be selected. * Passing an array will reset previously set items. * Passing a string will append an item. * * Usage options: * * `select([$item1, $item2, ...])` * * `select(string $expression)` * * `select(string $expression, string $alias)` * * @param array|string $select */ public function select($select, ?string $alias = null) : self { if (is_array($select)) { $this->params['select'] = $select; return $this; } if (is_string($select)) { $this->params['select'] = $this->params['select'] ?? []; if ($alias) { $this->params['select'][] = [$select, $alias]; } else { $this->params['select'][] = $select; } return $this; } throw new InvalidArgumentException(); } /** * Specify GROUP BY. */ public function groupBy(array $groupBy) : self { $this->params['groupBy'] = $groupBy; return $this; } /** * Add a HAVING clause. * * Two usage options: * * `having(array $havingClause)` * * `having(string $key, string $value)` * * @param array|string $keyOrClause * @param ?array|string $value */ public function having($keyOrClause = [], $value = null) : self { $this->applyWhereClause('havingClause', $keyOrClause, $value); return $this; } /** * @todo Remove? */ public function withDeleted() : self { $this->params['withDeleted'] = true; return $this; } }