МЕЖДУ диапазоном, включающим «1», также возвращается «10»

Я получаю неожиданное поведение, используя предикат BETWEEN в ZF2.
Рассмотрим следующий код:

$ranges = array(
array(
'min' => 2,
'max' => 4
),
array(
'min' => 7,
'max' => 9
)
);

$predicates = array();

foreach($ranges as $range){
// create a new 'Between' predicate and add it to array
$between = new Predicate\Between('my_field', $range['min'], $range['max']);
array_push($predicates, $between);
}

// add predicateset
$select->where->addPredicate(
new Predicate\PredicateSet(
$predicates,
Predicate\PredicateSet::COMBINED_BY_OR
)
);

Теперь все это работает нормально, кроме случаев использования диапазона, включающего 1 (например. 0-2, 1-5 так далее).
В этом случае набор результатов также включает в себя значения 10

Тем не менее, это не происходит, когда я пытаюсь что-то вроде запроса ниже непосредственно на БД:

SELECT * FROM my_table WHERE my_field BETWEEN 0 AND 5

(my_field это varchar в этом случае)

Что мне здесь не хватает?

1

Решение

После того, как я покопался в библиотеках ZF2, я обнаружил, что Between предикат, всегда устанавливает входные значения в TYPE_VALUE, что в основном означает, что значения заключены в кавычки.

Одним из решений было бы изменить Between класс в библиотеке, чтобы использовать TYPE_LITERAL, но я думаю, что это плохая практика возиться с библиотекой ZF2.

В конце я заставил его работать, установив пользовательскую спецификацию для предиката, для которой ZF2 предоставляет метод setSpecification, Это приведёт значения обратно к целому числу.

//...

$between = new Predicate\Between('my_field', $range['min'], $range['max']);

$between->setSpecification('%1$s BETWEEN CAST(%2$s AS UNSIGNED) AND CAST(%3$s AS UNSIGNED)');

//...

Возможно, не самое красивое решение, но оно работает для того, что мне нужно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]