/** * Adds an adapter-specific LIMIT clause to the SELECT statement. * [ borrowed from Zend Framework ] * * @param string $query * @param mixed $limit * @param mixed $offset * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html * @return string * @override */ public function writeLimitClause($query, $limit = false, $offset = false) { if ($limit > 0) { $count = intval($limit); $offset = intval($offset); if ($offset < 0) { throw \Doctrine\Common\DoctrineException::limitOffsetInvalid($offset); } $orderby = stristr($query, 'ORDER BY'); if ($orderby !== false) { $sort = stripos($orderby, 'desc') !== false ? 'desc' : 'asc'; $order = str_ireplace('ORDER BY', '', $orderby); $order = trim(preg_replace('/ASC|DESC/i', '', $order)); } $query = preg_replace('/^SELECT\\s/i', 'SELECT TOP ' . ($count + $offset) . ' ', $query); $query = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $query . ') AS inner_tbl'; if ($orderby !== false) { $query .= ' ORDER BY ' . $order . ' '; $query .= stripos($sort, 'asc') !== false ? 'DESC' : 'ASC'; } $query .= ') AS outer_tbl'; if ($orderby !== false) { $query .= ' ORDER BY ' . $order . ' ' . $sort; } return $query; } return $query; }