/** * 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 string|array $sort Database column to sort on. * Falls back to {@link DataObject::$default_sort} if not provided. * @param string|array $limit * @param SQLQuery $existingQuery * @return SQLQuery */ public function getQuery($searchParams, $sort = false, $limit = false, $existingQuery = null) { 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); } $query->limit($limit); $query->sort($sort); // hack to work with $searchParems when it's an Object $searchParamArray = array(); if (is_object($searchParams)) { $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()) { $filter->apply($query->dataQuery()); } } } if ($this->connective != "AND") { throw new Exception("SearchContext connective '{$this->connective}' not supported after ORM-rewrite."); } return $query; }