实现目标:在创建代理商商品数据时,需要同时验证【代理商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语句。
源码里面关联的方法太多了,目前水平有限看不懂,有了解的高手还请不吝赐教!