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

实现目标:在创建代理商商品数据时,需要同时验证【代理商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语句。

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

 

你可能感兴趣的:(laravel-admin)