Skip to content

Commit

Permalink
Merge pull request #27 from vpalousek98/master
Browse files Browse the repository at this point in the history
feat: change strict in *by* method to mode with more operators
  • Loading branch information
thorewi authored Oct 20, 2023
2 parents c516348 + 692c307 commit bcb3049
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 15 deletions.
117 changes: 103 additions & 14 deletions src/QueryObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -170,40 +170,129 @@ final public function disableDefaultOrder(): static

/**
* Obecná metoda na vyhledávání ve více sloupcích (spojení přes OR).
* Podle vyhledávané hodnoty, případně parametru strict (LIKE vs. =), se zvolí typ vyhledávání (IN, LIKE, =).
* Operátor lze měnit pomocí QueryObjectByMode $mode, výchozí je STRICT (equal)
*
* @param string|string[] $column
* @param mixed $value
* @param bool $strict
* @param QueryObjectByMode $mode
* @return $this
*/
final public function by(array|string $column, mixed $value, bool $strict = true): static
final public function by(array|string $column, mixed $value, QueryObjectByMode $mode = QueryObjectByMode::STRICT): static
{
$this->filter[] = function (QueryBuilder $qb) use ($column, $value, $strict) {
$this->filter[] = function (QueryBuilder $qb) use ($column, $value, $mode) {
$column = (array) $column;

$this->validateFieldNames($column);

$this->addJoins($qb, $column);

$x = array_map(
function($_column) use ($qb, $value, $strict) {
function($_column) use ($qb, $value, $mode) {
$paramName = 'by_' . str_replace('.', '_', $_column);

// Pro between chceme rozdelit value do dvou různých podmínek
if ($mode === QueryObjectByMode::BETWEEN || $mode === QueryObjectByMode::NOT_BETWEEN) {
$paramName2 = 'by_' . str_replace('.', '_', $_column) . '_2';
}

$_column = $this->addColumnPrefix($_column);
$_column = $this->getJoinedEntityColumnName($_column);

if (is_array($value)) {
$condition = "$_column IN (:$paramName)";
$qb->setParameter($paramName, $value);
} else if (is_string($value) && !$strict) {
$condition = "$_column LIKE :$paramName";
$qb->setParameter($paramName, "%$value%");
} else if (is_null($value)) {
$condition = "$_column IS NULL";
if (is_null($value)) {
$mode = QueryObjectByMode::IS_EMPTY;
} else if (is_array($value) && $mode === QueryObjectByMode::STRICT) {
$mode = QueryObjectByMode::IN_ARRAY;
}

$condition = "$_column = :$paramName";

switch ($mode) {
case QueryObjectByMode::STRICT:
$value = "$value";
$condition = "$_column = :$paramName";
break;

case QueryObjectByMode::NOT_EQUAL:
$value = "$value";
$condition = "$_column != :$paramName";
break;

case QueryObjectByMode::STARTS_WITH:
$value = "$value%";
$condition = "$_column LIKE :$paramName";
break;

case QueryObjectByMode::ENDS_WITH:
$value = "%$value";
$condition = "$_column LIKE :$paramName";
break;

case QueryObjectByMode::CONTAINS:
$value = "%$value%";
$condition = "$_column LIKE :$paramName";
break;

case QueryObjectByMode::NOT_CONTAINS:
$value = "%$value%";
$condition = "$_column NOT LIKE :$paramName";
break;

case QueryObjectByMode::IS_EMPTY:
$value = null;
$condition = "$_column IS NULL";
break;

case QueryObjectByMode::IS_NOT_EMPTY:
$value = null;
$condition = "$_column IS NOT NULL";
break;

case QueryObjectByMode::IN_ARRAY:
$condition = "$_column IN (:$paramName)";
break;

case QueryObjectByMode::NOT_IN_ARRAY:
$condition = "$_column NOT IN (:$paramName)";
break;

case QueryObjectByMode::GREATER:
$value = "$value";
$condition = "$_column > :$paramName";
break;

case QueryObjectByMode::GREATER_OR_EQUAL:
$value = "$value";
$condition = "$_column >= :$paramName";
break;

case QueryObjectByMode::LESS:
$value = "$value";
$condition = "$_column < :$paramName";
break;

case QueryObjectByMode::LESS_OR_EQUAL:
$value = "$value";
$condition = "$_column <= :$paramName";
break;

case QueryObjectByMode::BETWEEN:
$condition = "$_column BETWEEN :$paramName AND :$paramName2";
break;

case QueryObjectByMode::NOT_BETWEEN:
$condition = "$_column NOT BETWEEN :$paramName AND :$paramName2";
break;
}

if ($mode === QueryObjectByMode::BETWEEN || $mode === QueryObjectByMode::NOT_BETWEEN) {
$qb->setParameter($paramName, $value[0]);
$qb->setParameter($paramName2, $value[1]);
} else {
$condition = "$_column = :$paramName";
$qb->setParameter($paramName, $value);
}



return $condition;
},
$column
Expand Down
23 changes: 23 additions & 0 deletions src/QueryObjectByMode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace ADT\DoctrineComponents;

enum QueryObjectByMode: string
{
case STRICT = 'strict';
case NOT_EQUAL = 'notEqual';
case STARTS_WITH = 'startsWith';
case ENDS_WITH = 'endsWith';
case CONTAINS = 'contains';
case NOT_CONTAINS = 'notContains';
case IS_EMPTY = 'isEmpty';
case IS_NOT_EMPTY = 'isNotEmpty';
case IN_ARRAY = 'isInArray';
case NOT_IN_ARRAY = 'isNotInArray';
case GREATER = 'greater';
case GREATER_OR_EQUAL = 'greaterOrEqual';
case LESS = 'less';
case LESS_OR_EQUAL = 'lessOrEqual';
case BETWEEN = 'between';
case NOT_BETWEEN = 'notBetween';
}
2 changes: 1 addition & 1 deletion src/QueryObjectInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

interface QueryObjectInterface
{
public function by(array|string $column, mixed $value, bool $strict = false): static;
public function by(array|string $column, mixed $value, QueryObjectByMode $mode = QueryObjectByMode::STRICT): static;
public function orderBy(array|string $field, ?string $order = null): static;

public function fetch(?int $limit = null): array;
Expand Down

0 comments on commit bcb3049

Please sign in to comment.