public function order($order, $desc = null)
{
// Case with comma-separated fields or first argument being an array
if (is_string($order) && strpos($order, ',') !== false) {
// Check for multiple
$order = explode(',', $order);
}
if (is_array($order)) {
if (!is_null($desc)) {
throw $this->exception('If first argument is array, second argument must not be used');
}
foreach (array_reverse($order) as $o) {
$this->order($o);
}
return $this;
}
// First argument may contain space, to divide field and keyword
if (is_null($desc) && is_string($order) && strpos($order, ' ') !== false) {
list($order, $desc) = array_map('trim', explode(' ', trim($order), 2));
}
if (is_string($order) && strpos($order, '.') !== false) {
$order = implode('.', $this->bt(explode('.', $order)));
}
if (is_bool($desc)) {
$desc = $desc ? 'desc' : '';
} elseif (strtolower($desc) === 'asc') {
$desc = '';
} elseif ($desc && strtolower($desc) != 'desc') {
throw $this->exception('Incorrect ordering keyword')->addMoreInfo('order by', $desc);
}
// TODO:
/*
if (isset($this->args['order'][0]) and (
$this->args['order'][0] === array($order,$desc))) {
}
*/
$this->args['order'][] = array($order, $desc);
return $this;
}