skip($skip)->take($pagination['size']); } final protected function addSortParams(Builder $query, ?SortFields $sort): Builder { if (null === $sort) { return $query; } foreach ($sort->all() as $sortField) { $query->orderBy($sortField->name(), $sortField->isAscending() ? 'ASC' : 'DESC'); } return $query; } final protected function addFilterParams(string $class, Builder $query, ?FilterParameters $filters): Builder { if (null === $filters) { return $query; } $config = config(sprintf('firefly.valid_query_filters.%s', $class)) ?? []; if (0 === count($filters->all())) { return $query; } $query->where(function (Builder $q) use ($config, $filters): void { foreach ($filters->all() as $filter) { if (in_array($filter->key(), $config, true)) { foreach ($filter->value() as $value) { $q->where($filter->key(), 'LIKE', sprintf('%%%s%%', $value)); } } } }); // some filters are special, i.e. the account type filter. $typeFilters = $filters->value('type', false); if (false !== $typeFilters && count($typeFilters) > 0) { $query->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id'); foreach ($typeFilters as $typeFilter) { $types = $this->mapAccountTypes($typeFilter); $query->whereIn('account_types.type', $types); } } return $query; } }