From 51a95814e095069f9c6874d74dc693350e159bff Mon Sep 17 00:00:00 2001 From: Bernd Bestel Date: Fri, 11 Dec 2020 19:32:08 +0100 Subject: [PATCH] Handle `null` in API filter (closes #1173) --- controllers/BaseApiController.php | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/controllers/BaseApiController.php b/controllers/BaseApiController.php index 3965d7f6..e63e8697 100644 --- a/controllers/BaseApiController.php +++ b/controllers/BaseApiController.php @@ -87,13 +87,23 @@ class BaseApiController extends BaseController $q, $matches ); - error_log(var_export($matches, true)); + + if (!array_key_exists('field', $matches) || !array_key_exists('op', $matches) || !array_key_exists('value', $matches)) + { + throw new \Exception('Invalid query'); + } + + if (strtolower($matches['value']) == 'null') + { + $matches['value'] = ''; + } + switch ($matches['op']) { case '=': - $data = $data->where($matches['field'], $matches['value']); + $data = $data->where('IFNULL(' . $matches['field'] . ', \'\') = ?', $matches['value']); break; case '!=': - $data = $data->whereNot($matches['field'], $matches['value']); + $data = $data->where('IFNULL(' . $matches['field'] . ', \'\') != ?', $matches['value']); break; case '~': $data = $data->where($matches['field'] . ' LIKE ?', '%' . $matches['value'] . '%'); @@ -101,25 +111,22 @@ class BaseApiController extends BaseController case '!~': $data = $data->where($matches['field'] . ' NOT LIKE ?', '%' . $matches['value'] . '%'); break; - case '!>=': case '<': $data = $data->where($matches['field'] . ' < ?', $matches['value']); break; - case '!<=': case '>': $data = $data->where($matches['field'] . ' > ?', $matches['value']); break; - case '!<': case '>=': $data = $data->where($matches['field'] . ' >= ?', $matches['value']); break; - case '!>': case '<=': $data = $data->where($matches['field'] . ' <= ?', $matches['value']); break; } } + return $data; }