/** * Returns a SQL object representing the search context for the given * list of query parameters. * * @param array $searchParams Map of search criteria, mostly taked from $_REQUEST. * If a filter is applied to a relationship in dot notation, * the parameter name should have the dots replaced with double underscores, * for example "Comments__Name" instead of the filter name "Comments.Name". * @param array|bool|string $sort Database column to sort on. * Falls back to {@link DataObject::$default_sort} if not provided. * @param array|bool|string $limit * @param DataList $existingQuery * @return DataList * @throws Exception */ public function getQuery($searchParams, $sort = false, $limit = false, $existingQuery = null) { /** DataList $query */ if ($existingQuery) { if (!$existingQuery instanceof DataList) { throw new InvalidArgumentException("existingQuery must be DataList"); } if ($existingQuery->dataClass() != $this->modelClass) { throw new InvalidArgumentException("existingQuery's dataClass is " . $existingQuery->dataClass() . ", {$this->modelClass} expected."); } $query = $existingQuery; } else { $query = DataList::create($this->modelClass); } if (is_array($limit)) { $query = $query->limit(isset($limit['limit']) ? $limit['limit'] : null, isset($limit['start']) ? $limit['start'] : null); } else { $query = $query->limit($limit); } $query = $query->sort($sort); // hack to work with $searchParems when it's an Object if ($searchParams instanceof HTTPRequest) { $searchParamArray = $searchParams->getVars(); } else { $searchParamArray = $searchParams; } foreach ($searchParamArray as $key => $value) { $key = str_replace('__', '.', $key); if ($filter = $this->getFilter($key)) { $filter->setModel($this->modelClass); $filter->setValue($value); if (!$filter->isEmpty()) { $query = $query->alterDataQuery(array($filter, 'apply')); } } } if ($this->connective != "AND") { throw new Exception("SearchContext connective '{$this->connective}' not supported after ORM-rewrite."); } return $query; }
/** * This method returns a copy of this list that does not contain any DataObjects that exists in $list * * The $list passed needs to contain the same dataclass as $this * * @param DataList $list * @return DataList * @throws BadMethodCallException */ public function subtract(DataList $list) { if ($this->dataClass() != $list->dataClass()) { throw new InvalidArgumentException('The list passed must have the same dataclass as this class'); } return $this->alterDataQuery(function (DataQuery $query) use($list) { $query->subtract($list->dataQuery()); }); }