Validate的unique函数在生成map去数据库查询的时候,因为采用了老版本的表达式的where格式 ,如 ['name'=>'123', 'id'=>['neq',1]]的情况下,在调用model(Query)的时候会报表达式解析错误。
我根据情况改了一下,试了一下问题已经修复,希望能帮到大家
public function unique($value, $rule, $data, $field)
{
if (is_string($rule)) {
$rule = explode(',', $rule);
}
if (false !== strpos($rule[0], '\\')) {
// 指定模型类
$db = new $rule[0];
} else {
try {
$db = Container::get('app')->model($rule[0]);
} catch (ClassNotFoundException $e) {
$db = Db::name($rule[0]);
}
}
$key = isset($rule[1]) ? $rule[1] : $field;
if (strpos($key, '^')) {
// 支持多个字段验证
$fields = explode('^', $key);
foreach ($fields as $key) {
// $map[$key] = $data[$key]; # bug源码
$map[] = [$key, "=", $data[$key]]; # 修改后的代码
}
} elseif (strpos($key, '=')) {
// parse_str($key, $map); # bug源码
$tmp = []; # 修改后的代码 start
parse_str($key, $tmp);
foreach ($tmp as $key2=>$value2)
{
$map[] =[$key2, "=", $value2];
} # 修改后的代码 end
} else {
// $map[$key] = $data[$field]; # bug源码
$map[] = [$key, "=", $data[$key]]; # 修改后的代码
}
$pk = strval(isset($rule[3]) ? $rule[3] : $db->getPk());
if (isset($rule[2])) {
// $map[$pk] = ['neq', $rule[2]]; # bug源码
$map[] = [$pk, '<>', $rule[2]]; # 修改后的代码
} elseif (isset($data[$pk])) {
// $map[$pk] = ['neq', $data[$pk]]; # bug源码
$map[] = [$pk, '<>', $data[$pk]]; # 修改后的代码
}
if ($db->where($map)->field($pk)->find()) {
return false;
}
return true;
} 最佳答案