我在 ZF2 中使用 BETWEEN 谓词时遇到一些意外行为。 考虑以下代码:
$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
)
我在这里错过了什么?
最佳答案
在深入了解 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)');
//...
也许不是最漂亮的解决方案,但它可以满足我的需要。
关于php - 范围包括 '1' 的 BETWEEN 也返回 '10',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678151/