Laravel 对多个插入的验证

Posted

技术标签:

【中文标题】Laravel 对多个插入的验证【英文标题】:Laravel validation on multiple insert 【发布时间】:2018-01-20 09:43:48 【问题描述】:

我有一个体育赛事的数据库表。每个活动都有年份、活动名称和活动获胜者。

我的此表的管理视图允许按年份对事件进行分组并批量插入(通常一次插入 8 个体育事件行)。我有一个用 Vue 编写的表格,它允许将最多 8 个体育赛事行添加到界面、填充和提交字段。这工作很好

这个方法是

public function storeMultiple(Request $request)
    

        $year = $request->year;
        $newEvents = $request->events;

        foreach ($newEvents as $key => $value) 
            DB::table('sport_events')->insert([
                'team_id' => 1,
                'sort_order' => $value['sort_order'],
                'year' => $year,
                'event' => $value['event'],
                'winner' => $value['winner'],
                'created_at' => Carbon::now(),
                'updated_at' => Carbon::now()
            ]);
        

     

虽然我知道这不是一个好方法(数据库结构限制了我,而不是让年份成为关键和体育赛事)并且对于这样一个小而罕见的用例,我对性能折衷感到满意。

表单通过 Axios 提交到我的路线,所有内容都按我的预期进入数据库。

现在我希望为方法添加验证,确保每个事件都有事件名称和获胜者。

$validator = Validator::make($request->all(), [
            'year' => 'required',
            'events.*' => 'required',
        ]);

        if ($validator->fails()) 
            return response()->json([ 'errors' => $validator ]);
        

我的提交似乎绕过了我已经进行的验证检查,获得了成功状态。

我的 Vue 提交方法是这样做的

submit () 
                axios(
                    method: 'post',
                    url: '/admin/sports',
                    data: 
                        year: this.year,
                        sports: this.sports
                    
                ).then((response) => 
            window.location.href = '/admin/sports'

                ).catch((error) => 
                    // error
                )
            

这种方法哪里出错了?

更新:Thiago 的建议解决了问题,但随后我不得不更新我的 Vue 组件中的提交方法以显示错误????????

submit () 
                axios(
                    method: 'post',
                    url: '/admin/sports',
                    data: 
                        year: this.year,
                        sports: this.sports
                    
                ).then((response) => 
                    window.location.href = '/admin/sports'
                ).catch((error) => 
                    this.errors = error.response.data.errors
                    console.log(this.errors)
                )
            

【问题讨论】:

【参考方案1】:

试试这个:

$validator = Validator::make($request->all(), [
    'year' => 'required',
    'events.*.event' => 'required',
    'events.*.winner' => 'required',
]);

您在问题文本中所说的“获得成功状态”是什么意思?

数据是否进入数据库,或者您只是意味着 AJAX 调用成功返回?

要使 AJAX 请求失败,请使用:

if ($validator->fails()) 
    return response()
        ->json([ 'errors' => $validator->errors()->messages() ])
        ->setStatusCode(400);

【讨论】:

不,仍然绕过验证。即使只是通过尝试验证年份是否存在来简化它 - 删除事件数组,仍然失败:( 只是 AJAX 调用成功返回并将我重定向到如果数据确实通过了/admin/costs。所以现在效果更好一点,因为它不会重定向,但我没有看到错误被传回。 Laravel 不会自动执行此操作。为此,您需要从响应中读取错误并通过 JS 显示错误。也许这可以帮助你:laracasts.com/discuss/channels/general-discussion/… 谢谢蒂亚戈 - 现在整理好了??

以上是关于Laravel 对多个插入的验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 多个字段的相同自定义错误消息

php Laravel表单输入验证和插入

Laravel 5 - 针对两个表进行身份验证

Laravel Eloquent 验证插入异常?

Laravel 5.0 文件上传验证

如何在 laravel 验证中验证多个电子邮件?