top-think/think-validate 唯一性验证一直失败

邹意

问题描述

数据库用的webman/think-orm
验证器里面定义某个字段是唯一的
经过测试不管是添加,还是更新数据:验证都无法通过
测试多个验证器都是这样,只要有唯一就无法通过
不知道是验证器的问题还是模型的问题

程序代码或配置

class AdminMenu extends Validate
{

    protected $rule =   [
        'title' => 'require',
        'type' => 'require|in:1,2,3',
        'name'=>'unique:AdminMenu', //这个字段无法验证通过
        'component_path'=>'unique:AdminMenu',
    ];

    protected $message  =   [
        'title.require'  => '请输入菜单名称',
        'type.require'  => '请选择类型',
        'type.in'  => '非法的类型值',
        'name.unique' => '组件name值已存在,请更换',
        'component_path.unique' => '组件路劲值已存在,请更换',
    ];

}

翻源码跟tp的对比

tp的有下面这个方法,手动安装topthink/think-validate就没得这个方法
public function unique

439 2 0
2个回答

yzh52521
  • 邹意 2023-08-09

    报错:Class "Symfony\Component\Translation\Translator" not found,语言包加载失败,将插件的Validate.php 1635行config( 'translations.locale' )改为config( 'translation.locale' )能正常读取配置后,还是报这个错

  • yzh52521 2023-08-10

    你没有安装 symfony/translation

864328615
/**
 * 基础验证器
 */
class Base extends validate
{
    /**
     * 唯一验证
     * @param $value
     * @param $rule
     * @param array $data
     * @param string $field
     * @return bool
     */
    public function unique($value, $rule, array $data = [], string $field = ''): bool
    {
        if (is_string($rule)) {
            $rule = explode(',', $rule);
        }
        $db = Db::table($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]];
        }
        //获取主键
        if(!empty($rule[3])){
            $pk = $rule[3];
        }else{
            $result = Db::select("SHOW KEYS FROM ".$rule[0]." WHERE Key_name = 'PRIMARY'");
            $pk = $result[0]->Column_name;
        }
        if (is_string($pk)) {
            if (isset($rule[2])) {
                $map[] = [$pk, '<>', $rule[2]];
            } elseif (isset($data[$pk])) {
                $map[] = [$pk, '<>', $data[$pk]];
            }
        }
        if ($db->where($map)->select($pk)->exists()) {
            return false;
        }
        return true;
    }
}

这是lv的模型 tp的话自己去源码把拉下 复制出来就行了

  • 暂无评论
🔝