重写一个unique方法 其他的都继承这个方法
<?php
namespace app\common\validate;
use think\Validate;
class CommBaseValidate extends Validate
{
public function unique($value, $rule, array $data = [], string $field = ''): bool
{
if (is_string($rule)) {
$rule = explode(',', $rule);
}
if (false !== strpos($rule[0], '\\')) {
// 指定模型类
$db = new $rule[0];
} else {
$db = $this->db->name($rule[0]);
}
$key = $rule[1] ?? $field;
$map = [];
if (strpos($key, '^')) {
// 支持多个字段验证
$fields = explode('^', $key);
foreach ($fields as $key) {
if (isset($data[$key])) {
$map[] = [$key, '=', $data[$key]];
}
}
} elseif (isset($data[$field])) {
$map[] = [$key, '=', $data[$field]];
} else {
$map = [];
}
$pk = !empty($rule[3]) ? $rule[3] : $db->getPk();
if (is_string($pk)) {
if (isset($rule[2])) {
if (isset($data[$rule[2]])) {
$map[] = [$pk, '<>', $data[$rule[2]]];
} else {
$map[] = [$pk, '<>', $rule[2]];
}
} elseif (isset($data[$pk])) {
$map[] = [$pk, '<>', $data[$pk]];
}
}
if ($db->where($map)->field($pk)->find()) {
return false;
}
return true;
}
}
<?php
namespace app\common\validate;
use think\Validate;
class CommErpProductClassValidate extends CommBaseValidate
{
# unique:erp_product_class(表名),name(字段名),id(排除重复的字段)
protected $rule = [
'name' => 'require|length:2,20|unique:erp_product_class,name,id',
];
protected $message = [
'name.require' => '名称不能为空',
'name.length' => '名称为2-20个字符',
'name.unique' => '名称不能重复',
];
protected $scene = [
'add' => ['name'],
'edit' => ['name'],
];
}