diff --git a/src/condition/Condition.php b/src/condition/Condition.php index d220fa6..f9fbf81 100644 --- a/src/condition/Condition.php +++ b/src/condition/Condition.php @@ -13,7 +13,8 @@ class Condition const LESS_OR_EQUALS = 5; const GREATER_OR_EQUALS = 6; const BETWEEN = 7; - const IN = 8; + const LIKE = 8; + const IN = 9; protected $conditions = []; protected $sort = []; @@ -121,6 +122,20 @@ public function addBetweenCondition(string $field, $valueFrom, $valueTo) return $this; } + /** + * @param string $field + * @param $value + * @param bool $left + * @param bool $right + * + * @return $this + */ + public function addLikeCondition(string $field, $value, $left = true, $right = true) + { + $this->conditions[] = [self::LIKE, $field, $value, $left, $right]; + return $this; + } + /** * @param string $field * @param array $array @@ -134,15 +149,12 @@ public function addInCondition(string $field, array $array, bool $isNumeric = fa } /** - * @param $sortField - * @param $sortDir + * @param string $sortField + * @param int $sortDir SORT FLAG (SORT_ASC, SORT_DESC) * @return $this */ public function addSort(string $sortField, int $sortDir) { - if(!is_numeric($sortDir)) { - $sortDir = strtolower($sortDir) == 'asc' ? SORT_ASC : SORT_DESC; - } $this->sort[$sortField] = $sortDir; return $this; } diff --git a/src/condition/ConditionDbParser.php b/src/condition/ConditionDbParser.php index 54927fb..00b285c 100644 --- a/src/condition/ConditionDbParser.php +++ b/src/condition/ConditionDbParser.php @@ -40,6 +40,12 @@ public function parse(QueryBuilder $queryBuilder, Condition $condition = null) $queryBuilder->andWhere("{$cond[0]} BETWEEN " . $queryBuilder->createNamedParameter($cond[1]) . " AND " . $queryBuilder->createNamedParameter($cond[2])); break; + case Condition::LIKE: + $value = $cond[2] ? '%' : ''; + $value .= $cond[1]; + $value .= $cond[3] ? '%' : ''; + $queryBuilder->andWhere("{$cond[0]} LIKE " . $queryBuilder->createNamedParameter($value)); + break; case Condition::IN: if($cond[1]) { $isNumeric = $cond[2]; diff --git a/tests/condition/ConditionDbParserTest.php b/tests/condition/ConditionDbParserTest.php index e48a31b..a3ede33 100644 --- a/tests/condition/ConditionDbParserTest.php +++ b/tests/condition/ConditionDbParserTest.php @@ -5,6 +5,15 @@ class ConditionDbParserTest extends \PHPUnit\Framework\TestCase { + public function testParseEmpty() + { + /** @var \Doctrine\DBAL\Query\QueryBuilder $qb */ + $qb = $this->createMock(\Doctrine\DBAL\Query\QueryBuilder::class); + $parser = new \WebComplete\core\condition\ConditionDbParser(); + $parser->parse($qb); + $this->assertTrue(true); + } + public function testParse() { $condition = new Condition(); @@ -15,6 +24,7 @@ public function testParse() $condition->addLessOrEqualsCondition('e', 5); $condition->addGreaterOrEqualsCondition('f', 6); $condition->addBetweenCondition('g', 7, 8); + $condition->addLikeCondition('l', 'asd'); $condition->addInCondition('h', [9, 10]); $condition->addInCondition('i', [9, 10], true); $condition->addInCondition('j', []); @@ -30,7 +40,7 @@ public function testParse() $qb->select('*')->from('tmp'); $parser->parse($qb, $condition); - $sql = 'SELECT * FROM tmp WHERE (a = :dcValue1) AND (b <> :dcValue2) AND (c < :dcValue3) AND (d > :dcValue4) AND (e <= :dcValue5) AND (f >= :dcValue6) AND (g BETWEEN :dcValue7 AND :dcValue8) AND (h IN (:dcValue9,:dcValue10)) AND (i IN (9,10)) AND (1 = 2) ORDER BY f2 desc LIMIT 15 OFFSET 5'; + $sql = 'SELECT * FROM tmp WHERE (a = :dcValue1) AND (b <> :dcValue2) AND (c < :dcValue3) AND (d > :dcValue4) AND (e <= :dcValue5) AND (f >= :dcValue6) AND (g BETWEEN :dcValue7 AND :dcValue8) AND (l LIKE :dcValue9) AND (h IN (:dcValue10,:dcValue11)) AND (i IN (9,10)) AND (1 = 2) ORDER BY f2 desc LIMIT 15 OFFSET 5'; $this->assertEquals($sql, $qb->getSQL()); $this->assertEquals([ 'dcValue1' => 1, @@ -41,8 +51,9 @@ public function testParse() 'dcValue6' => 6, 'dcValue7' => 7, 'dcValue8' => 8, - 'dcValue9' => 9, - 'dcValue10' => 10, + 'dcValue9' => '%asd%', + 'dcValue10' => 9, + 'dcValue11' => 10, ], $qb->getParameters()); } diff --git a/tests/condition/ConditionTest.php b/tests/condition/ConditionTest.php index bb48d93..baf7d4f 100644 --- a/tests/condition/ConditionTest.php +++ b/tests/condition/ConditionTest.php @@ -16,6 +16,7 @@ public function testConditions() $condition->addGreaterOrEqualsCondition('f', 6); $condition->addBetweenCondition('g', 7, 8); $condition->addInCondition('h', [9, 10]); + $condition->addLikeCondition('i', 'asd', true, false); $condition->addSort('f1', SORT_ASC); $condition->addSort('f2', SORT_DESC); $condition->offset(5); @@ -33,6 +34,7 @@ public function testConditions() [Condition::GREATER_OR_EQUALS, 'f', 6], [Condition::BETWEEN, 'g', 7, 8], [Condition::IN, 'h', [9, 10], false], + [Condition::LIKE, 'i', 'asd', true, false], ], $condition->getConditions()); } @@ -47,6 +49,7 @@ public function testConditionsArgs() [Condition::GREATER_OR_EQUALS, 'f', 6], [Condition::BETWEEN, 'g', 7, 8], [Condition::IN, 'h', [9, 10]], + [Condition::LIKE, 'i', 'asd', true, false], ], 'f1', SORT_DESC, 10, 5); $this->assertEquals(10, $condition->getOffset()); @@ -61,6 +64,7 @@ public function testConditionsArgs() [Condition::GREATER_OR_EQUALS, 'f', 6], [Condition::BETWEEN, 'g', 7, 8], [Condition::IN, 'h', [9, 10]], + [Condition::LIKE, 'i', 'asd', true, false], ], $condition->getConditions()); }