laravel-admin form表单验证问题 rules多条件组合验证

本文详细介绍了在 Laravel Admin 中如何为代理商品数据的创建和编辑过程添加唯一性验证,确保【代理商id】和【商品id】的组合在数据库中不重复。通过修改表单的 creationRules 和 updateRules 方法,结合 SQL 查询语句,实现了数据的准确性和完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现目标:在创建代理商商品数据时,需要同时验证【代理商id】和【商品id】是否同时存在数据表中,如果存在则返回数据已存在,如果不存在则创建成功;编辑商品时一样验证,但是要排除自身这条数据。

未添加验证的代码是

$form->select('agentid', __('代理商id'))->options(function(){
            return User::all()->where('level','=',1)->where('state','=',1)->pluck('name', 'id');
        });

加入验证条件的话,需要添加代码,具体如下

$form = new Form(new Agentgood());

        // 获取当前的goodsid
        $goodsid = isset(request()->all()['goodsid']) ? request()->all()['goodsid'] : '';

        $form->select('agentid', __('代理商id'))->options(function(){
            return User::all()->where('level','=',1)->where('state','=',1)->pluck('name', 'id');
        })->creationRules(['required', "unique:agentgoods,agentid,NULL,NULL,goodsid,{$goodsid}"], ['unique' => '数据已存在'])
            ->updateRules(['required', "unique:agentgoods,agentid,NULL,NULL,id,!{{id}},goodsid,{$goodsid}"], ['unique' => '数据已存在']);

核心要点是:creationRulesh 和 updateRules 两个方法,至于其中的参数

"unique:agentgoods,agentid,NULL,NULL,id,!{{id}},goodsid,{$goodsid}"

没有弄太清楚确切规则,laravel-admin官方文档中没有相关描述,百度也没有找到具体说明,总之是经过多次盲目摸索发现这样是可以实现效果的。其实也做了一些分析的,例如,有尝试把其中的两个NULL改为id,3时,观察laravel-admin的报错信息:

 (SQL: select count(*) as aggregate from `agentgoods` where `agentid` = 7 and `3` id and `id` != 8 and `goodsid` = 5)

能够发现:unique:agentgoods 代表 唯一:表名; agentid默认等于当前agentid值;后面两个NULL参数,不知道具体意义,总之组合成sql语句时是位置颠倒的;再后面的参数都会被成对的拼凑成a=b的sql语句。

源码里面关联的方法太多了,目前水平有限看不懂,有了解的高手还请不吝赐教!

 

<think>我们正在讨论uView-Plus框架中form表单验证的使用方法和示例。根据提供的引用内容,我们可以总结出以下步骤:1.使用`u-form`组件创建表单,并绑定表单数据模型(使用`model`属性)。2.在`u-form-item`中设置`prop`属性,该属性对应校验规则中的字段名。3.定义校验规则(`rules`对象),每个字段对应一个规则数组。4.通过`ref`获取表单组件的引用,以便调用表单的验证方法。5.在提交等方法中调用表单的`validate`方法进行验证。根据引用[2]中的示例代码,我们可以整理出一个更详细的示例。注意:引用[2]使用的是Vue3的`<scriptsetup>`语法。下面是一个完整的uView-Plus表单验证示例:```vue<template><view><!--表单--><u-form:model="form":rules="rules"ref="uFormRef"><u-form-itemlabel="姓名"prop="name"><u-inputv-model="form.name"/></u-form-item><u-form-itemlabel="年龄"prop="age"><u-inputv-model="form.age"type="number"/></u-form-item></u-form><!--提交按钮--><u-button@click="submit">提交</u-button></view></template><scriptsetup>import{ref}from'vue';//表单数据constform=ref({name:'',age:''});//校验规则construles={name:[{required:true,message:'请输入姓名',trigger:['blur','change']},{min:2,max:5,message:'姓名长度在2到5个字符',trigger:['blur','change']}],age:[{required:true,message:'请输入年龄',trigger:['blur','change']},{type:'number',min:1,max:120,message:'年龄必须在1到120之间',trigger:['blur','change']}]};//表单引用constuFormRef=ref(null);//提交表单functionsubmit(){uFormRef.value.validate().then(valid=>{if(valid){uni.$u.toast('验证通过');//这里可以提交表单数据}else{uni.$u.toast('验证失败');}}).catch(err=>{console.error(err);uni.$u.toast('验证出错');});}</script>```###说明:1.**表单模型(`form`)**:使用`ref`创建响应式对象,包含表单字段(如`name`和`age`)。2.**校验规则(`rules`)**:每个字段的规则是一个数组,可以包含多个规则对象。每个规则对象可以指定:-`required`:是否必填。-`message`:错误提示信息。-`trigger`:触发校验的事件(如`blur`、`change`)。-其他验证规则,如`min`、`max`、`type`(如`'number'`)等。3.**表单引用(`uFormRef`)**:通过`ref`获取表单实例,以便调用其`validate`方法。4.**提交方法(`submit`)**:在提交时调用`validate`方法,根据返回的布尔值(`valid`)判断是否通过验证。###注意事项:-如果使用`type:'number'`,请确保输入的是数字类型。在示例中,我们使用了`type="number"`的输入框,但注意`v-model`绑定的值在输入框中是字符串类型,所以可能需要转换。或者,可以使用`u-input`的`number`属性,它可以将输入转换为数字类型(注意:在uView-Plus中,`u-input`的`type="number"`会将输入值转为字符串,而使用`number`属性可以将其转为数字)。因此,可以修改为:```vue<u-inputv-model="form.age"number/>```这样,`form.age`的值就是数字类型,便于进行数字校验。-如果校验规则中指定了`type:'number'`,则要求该字段的值必须是数字类型(不能是字符串形式的数字)。-如果遇到动态表单(如动态添加表单项),需要确保每个表单项的`prop`与规则中的字段名一致。###相关问题:1.如何在uView-Plus表单中使用自定义验证规则?2.如何重置uView-Plus表单的验证状态?3.uView-Plus表单验证支持异步验证吗?4.如何处理表单验证中的嵌套对象字段?</think>### uView-Plus Form 表单验证使用指南 #### 一、核心步骤 1. **初始化表单结构** 使用 `<u-form>` 组件包裹表单项,通过 `:model` 绑定数据对象: ```vue <u-form :model="formData" :rules="rules" ref="uFormRef"> <u-form-item label="用户名" prop="username"> <u-input v-model="formData.username" /> </u-form-item> <u-form-item label="密码" prop="password"> <u-input v-model="formData.password" password /> </u-form-item> </u-form> <u-button @click="submit">提交</u-button> ``` 2. **定义表单数据与规则** 在 Vue 3 的 `<script setup>` 中: ```javascript import { ref } from 'vue'; const formData = ref({ username: '', password: '' }); const rules = { username: [ { required: true, message: '用户名不能为空', trigger: 'blur' }, { min: 3, max: 10, message: '长度需在3-10字符', trigger: 'blur' } ], password: [ { required: true, message: '密码不能为空', trigger: 'change' }, { pattern: /^[A-Za-z0-9]{6,}$/, message: '需6位以上字母数字', trigger: 'blur' } ] }; ``` 3. **执行表单验证** 通过 `ref` 调用表单的 `validate` 方法: ```javascript const uFormRef = ref(null); const submit = () => { uFormRef.value.validate().then(valid => { valid ? uni.$u.toast('验证通过') : uni.$u.toast('验证失败'); }).catch(err => console.error(err)); }; ``` #### 二、关键功能详解 1. **验证规则配置** - `required`:必填校验 - `min`/`max`:长度限制 - `pattern`:正则表达式 - `validator`:自定义验证函数 ```javascript email: [ { validator: (rule, value) => /^\w+@\w+\.\w+$/.test(value), message: '邮箱格式错误' } ] ``` 2. **异步验证示例** ```javascript const asyncRule = { username: [{ validator: (_, value) => new Promise((resolve) => { setTimeout(() => resolve(value === 'admin'), 500); }), message: '用户名必须为admin' }] }; ``` #### 三、进阶技巧 1. **动态表单验证** 动态增减表单项时需步更新 `prop`: ```vue <u-form-item v-for="(item,index) in dynamicItems" :key="index" :prop="`items.${index}.value`"> <u-input v-model="item.value" /> </u-form-item> ``` 2. **重置表单状态** ```javascript uFormRef.value.resetFields(); // 重置表单数据与验证状态 ``` 3. **部分字段验证** ```javascript uFormRef.value.validateField('username'); // 仅验证指定字段 ``` #### 四、完整示例代码 ```vue <template> <view> <u-form :model="form" ref="uFormRef" :rules="rules"> <u-form-item label="手机号" prop="phone"> <u-input v-model="form.phone" placeholder="请输入手机号" /> </u-form-item> <u-form-item label="验证码" prop="code"> <u-input v-model="form.code" placeholder="6位验证码" /> <u-verification-code :seconds="60" @end="end" @start="start" ref="uCodeRef" /> </u-form-item> </u-form> <u-button @click="submit">提交验证</u-button> </view> </template> <script setup> import { ref } from 'vue'; const form = ref({ phone: '', code: '' }); const rules = { phone: [ { required: true, message: '手机号必填' }, { pattern: /^1[3-9]\d{9}$/, message: '手机号格式错误' } ], code: [ { required: true, message: '验证码必填' }, { len: 6, message: '验证码需6位' } ] }; const uFormRef = ref(null); const submit = () => { uFormRef.value.validate().then(valid => { valid && uni.$u.toast('提交成功!'); }); }; </script> ``` #### 五、常见问题解决 1. **验证不触发** - 检查 `prop` 是否与 `rules` 的键名一致 - 确认 `trigger` 事件(`blur`/`change`)是否匹配输入组件 2. **动态数据更新** 使用 `this.$refs.uFormRef.setRules(newRules)` 更新规则 > 参考文档:[uView-Plus表单验证官方文档](https://uiadmin.net/uview-plus/components/form.html)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值