Skip to content

Commit

Permalink
Adding ORDER BY REGEXP possibilites
Browse files Browse the repository at this point in the history
Example of use:
$MySqliDb->orderBy('name', 'desc', '^[a-zA-Z0-9]')->orderBy('name', 'desc');
// Is going to order by name but placing those name starting with special charaters at the end
  • Loading branch information
kennylajara authored Mar 7, 2017
1 parent b654510 commit dd37055
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions MysqliDb.php
Original file line number Diff line number Diff line change
Expand Up @@ -1061,16 +1061,16 @@ public function loadXml($importTable, $importFile, $importSettings = null)
/**
* This method allows you to specify multiple (method chaining optional) ORDER BY statements for SQL queries.
*
* @uses $MySqliDb->orderBy('id', 'desc')->orderBy('name', 'desc');
* @uses $MySqliDb->orderBy('id', 'desc')->orderBy('name', 'desc', '^[a-z]')->orderBy('name', 'desc');
*
* @param string $orderByField The name of the database field.
* @param string $orderByDirection Order direction.
* @param array $customFields Fieldset for ORDER BY FIELD() ordering
* @param mixed $customFieldsOrRegExp Array with fieldset for ORDER BY FIELD() ordering or string with regular expresion for ORDER BY REGEXP ordering
*
* @throws Exception
* @return MysqliDb
*/
public function orderBy($orderByField, $orderbyDirection = "DESC", $customFields = null)
public function orderBy($orderByField, $orderbyDirection = "DESC", $customFieldsOrRegExp = null)
{
$allowedDirection = Array("ASC", "DESC");
$orderbyDirection = strtoupper(trim($orderbyDirection));
Expand All @@ -1086,13 +1086,16 @@ public function orderBy($orderByField, $orderbyDirection = "DESC", $customFields
throw new Exception('Wrong order direction: ' . $orderbyDirection);
}

if (is_array($customFields)) {
foreach ($customFields as $key => $value) {
$customFields[$key] = preg_replace("/[^-a-z0-9\.\(\),_` ]+/i", '', $value);
if (is_array($customFieldsOrRegExp)) {
foreach ($customFieldsOrRegExp as $key => $value) {
$customFieldsOrRegExp[$key] = preg_replace("/[^-a-z0-9\.\(\),_` ]+/i", '', $value);
}

$orderByField = 'FIELD (' . $orderByField . ', "' . implode('","', $customFields) . '")';
}
$orderByField = 'FIELD (' . $orderByField . ', "' . implode('","', $customFieldsOrRegExp) . '")';
}elseif(is_string($customFieldsOrRegExp)){
$orderByField = $orderByField . " REGEXP '" . $customFieldsOrRegExp . "'";
}elseif($customFieldsOrRegExp !== null){
throw new Exception('Wrong custom field or Regular Expression: ' . $customFieldsOrRegExp);
}

$this->_orderBy[$orderByField] = $orderbyDirection;
return $this;
Expand Down

0 comments on commit dd37055

Please sign in to comment.