From 0db845a116ac5b9435a68c330ef251986ae70546 Mon Sep 17 00:00:00 2001 From: Gregory Letellier Date: Wed, 15 Nov 2023 11:50:15 +0100 Subject: [PATCH] add orWhere --- src/QueryBuilder.php | 48 ++++++++++++++++++++++++++++++++++++++------ tests/DbTest.php | 4 ++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/QueryBuilder.php b/src/QueryBuilder.php index c23ec70..8a5b34d 100644 --- a/src/QueryBuilder.php +++ b/src/QueryBuilder.php @@ -6,6 +6,7 @@ class QueryBuilder { protected array $columns; protected array $wheres; + protected array $orwheres; protected array $orders; protected array $groupby; protected string $table; @@ -16,6 +17,9 @@ class QueryBuilder protected string $raw_query; protected bool $distinct; + public const MODE_AND = 0; + public const MODE_OR = 1; + public function __construct($table, $pk = "id", $connection = "") { $this->table = $table; @@ -28,6 +32,7 @@ class QueryBuilder { $this->columns = []; $this->wheres = []; + $this->orwheres = []; $this->orders = []; $this->groupby = []; $this->offset = null; @@ -128,12 +133,28 @@ class QueryBuilder return $this; } + public function orWhere($condition, $operator, $value = null) + { + if ($value === null) { + $this->orwheres[] = new Expression($condition, "=", $operator); + } else { + $this->orwheres[] = new Expression($condition, $operator, $value); + } + return $this; + } + public function whereRaw(string $raw) { $this->wheres[] = $raw; return $this; } + public function orWhereRaw(string $raw) + { + $this->orwheres[] = $raw; + return $this; + } + public function find($id): mixed { $this->reset(); @@ -213,10 +234,17 @@ class QueryBuilder $query = "SELECT " . $distinct . " " . $columns . " FROM " . $this->table ; $where = $this->getWhere(); + $Orwhere = $this->getWhere(QueryBuilder::MODE_OR); + $this->fillData($ret); + if($where!="" && $Orwhere!="") + { + $Orwhere = " OR " . $Orwhere; + } + if ($where != "") { - $query .= " WHERE " . $where; + $query .= " WHERE " . $where . $Orwhere; } $query .= $this->getClause("GROUP By", $this->groupby); @@ -228,8 +256,8 @@ class QueryBuilder } private function fillData(Query &$query): void - { - foreach ($this->wheres as $expression) { + { + foreach (array_merge($this->wheres,$this->orwheres) as $expression) { if ($expression instanceof Expression) { if ($expression->hasData()) { $query->addData($expression->getValue()); @@ -238,10 +266,18 @@ class QueryBuilder } } - private function getWhere(): string + private function getWhere(int $mode = QueryBuilder::MODE_AND): string { $where = ""; - foreach ($this->wheres as $expression) { + $collection = match ($mode) { + QueryBuilder::MODE_AND => $this->wheres, + QueryBuilder::MODE_OR => $this->orwheres, + }; + $keyword = match ($mode) { + QueryBuilder::MODE_AND => " AND ", + QueryBuilder::MODE_OR => " OR ", + }; + foreach ($collection as $expression) { $sw = ""; if ($expression instanceof Expression) { $sw = $expression->raw(); @@ -252,7 +288,7 @@ class QueryBuilder } } if ($where != "" && $sw != "") { - $where .= " AND "; + $where .= " $keyword "; } $where .= $sw; } diff --git a/tests/DbTest.php b/tests/DbTest.php index d7438b3..d732815 100644 --- a/tests/DbTest.php +++ b/tests/DbTest.php @@ -98,6 +98,10 @@ test("querybuilder", function() { $qb->reset(); $rows = $qb->whereNotNull("col1")->get(); expect(count($rows))->toBe(2); + + $qb->reset(); + $rows = $qb->where("id",1)->orWhere("id",2)->get(); + expect(count($rows))->toBe(2); }); test("extending model",function()