數(shù)據(jù)庫用的webman/think-orm
驗證器里面定義某個字段是唯一的
經(jīng)過測試不管是添加,還是更新數(shù)據(jù):驗證都無法通過
測試多個驗證器都是這樣,只要有唯一就無法通過
不知道是驗證器的問題還是模型的問題
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的有下面這個方法,手動安裝topthink/think-validate就沒得這個方法
public function unique
/**
* 基礎驗證器
*/
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的話自己去源碼把拉下 復制出來就行了