只需将其包裹在QueryExpression::not():
use \Cake\Database\Expression\BetweenExpression;
use \Cake\Database\Expression\QueryExpression;
// ...
function (QueryExpression $exp) use ($field_value, $txtRule1, $txtRule2) {
return
$exp->not(
new BetweenExpression(
$field_value,
$txtRule1,
$txtRule2,
$exp->typeMap()->type($field_value)
)
);
}
新的表达式实例是必需的,否则您会将表达式嵌套在其自身中,这会在某些时候导致无限循环。如果您确定使用的是空表达式实例,也可以使用克隆
function (QueryExpression $exp) use ($field_value, $txtRule1, $txtRule2) {
$between = clone $exp;
return
$exp->not(
$between->between($field_value, $txtRule1, $txtRule2)
);
}
或将查询实例传递给可调用对象并创建一个新的查询表达式实例
function (QueryExpression $exp) use ($field_value, $txtRule1, $txtRule2, $query) {
return
$exp->not(
$query->newExpr()->between($field_value, $txtRule1, $txtRule2)
);
}
另见