BaseValidate.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | saiadmin [ saiadmin快速开发框架 ]
  4. // +----------------------------------------------------------------------
  5. // | Author: sai <1430792918@qq.com>
  6. // +----------------------------------------------------------------------
  7. namespace plugin\saiadmin\basic;
  8. use think\Validate;
  9. /**
  10. * 验证器基类
  11. */
  12. class BaseValidate extends Validate
  13. {
  14. /**
  15. * 验证是否唯一
  16. * @access public
  17. * @param mixed $value 字段值
  18. * @param mixed $rule 验证规则 格式:数据表,字段名,排除ID,主键名
  19. * @param array $data 数据
  20. * @param string $field 验证字段名
  21. * @return bool
  22. */
  23. public function unique($value, $rule, array $data = [], string $field = ''): bool
  24. {
  25. if (is_string($rule)) {
  26. $rule = explode(',', $rule);
  27. }
  28. if (str_contains($rule[0], '\\')) {
  29. // 指定模型类
  30. $db = new $rule[0];
  31. } else {
  32. return false;
  33. }
  34. $key = $rule[1] ?? $field;
  35. $map = [];
  36. if (str_contains($key, '^')) {
  37. // 支持多个字段验证
  38. $fields = explode('^', $key);
  39. foreach ($fields as $key) {
  40. if (isset($data[$key])) {
  41. $map[] = [$key, '=', $data[$key]];
  42. }
  43. }
  44. } elseif (strpos($key, '=')) {
  45. // 支持复杂验证
  46. parse_str($key, $array);
  47. foreach ($array as $k => $val) {
  48. $map[] = [$k, '=', $data[$k] ?? $val];
  49. }
  50. } elseif (isset($data[$field])) {
  51. $map[] = [$key, '=', $data[$field]];
  52. }
  53. $pk = !empty($rule[3]) ? $rule[3] : $db->getPrimaryKeyName();
  54. if (is_string($pk)) {
  55. if (isset($rule[2])) {
  56. $map[] = [$pk, '<>', $rule[2]];
  57. } elseif (isset($data[$pk])) {
  58. $map[] = [$pk, '<>', $data[$pk]];
  59. }
  60. }
  61. if ($db->where($map)->count() > 0) {
  62. return false;
  63. }
  64. return true;
  65. }
  66. }