/** * Testing fieldsOrLike * * @return void */ public function testFieldsOrLike() { $builder = new ExpressionBuilder(); /** @var Expr\Orx $result */ $result = $builder->fieldsOrLike('testField1,testField2,testField3', 'testValue1'); $this->assertInstanceOf(Expr\Orx::class, $result); $this->assertCount(3, $result->getParts()); }
/** * @param QueryBuilder $queryBuilder * @return void */ public function __invoke(QueryBuilder $queryBuilder) { $options = $this->getOptions(); if (!$options->getCriteria()) { return null; } $fieldMapping = $options->getFieldMapping(); $valueTypeMapping = $options->getValueTypeMapping(); $expressionBuilder = new ExpressionBuilder(); $parameters = []; foreach ($options->getCriteria() as $field => $value) { if ($value != '') { $queryField = $field; if (array_key_exists($field, $fieldMapping)) { $queryField = $fieldMapping[$field]; } $method = 'eq'; if (array_key_exists($field, $valueTypeMapping)) { $method = $valueTypeMapping[$field]; } if (is_array($method)) { $value = explode($method[1], $value); $method = $method[0]; } switch ($method) { case self::LIKE_LEFT: $value = '%' . $value; break; case self::LIKE: $value = '%' . $value . '%'; break; case self::LIKE_RIGHT: $value .= '%'; break; } if ($method === self::FIELD_TO_FIELD) { $queryBuilder->andWhere($expressionBuilder->eq($queryField, $value)); } else { if (method_exists($expressionBuilder, $method)) { if (is_array($value) && $method !== self::IN && $method !== self::NOT_IN) { call_user_func_array([$expressionBuilder, $method], $value); } else { $parameterNumber = $expressionBuilder->getNextParameterNumber(); $parameters[$parameterNumber] = $value; $queryBuilder->andWhere($expressionBuilder->{$method}($queryField, '?' . $parameterNumber)); } } } } } $queryBuilder->setParameters($parameters); }