首页 > 解决方案 > Laravel Validation Array 必须包含一个 boolean 为 true 的项目

问题描述

我正在验证问题和答案(用于测试创建)。我想确保 answers 数组至少包含一个“正确”项目。那么在哪里answers.*.correct => true

我目前有以下内容:

public function rules()
    {
        return [
            'title' => 'required|string|max:255',
            'test_id' => 'required|integer|exists:tests,id',
            'content' => 'required',
            'answers' => 'required|array',
            'answers.*.text' => 'required|string|max:255',
            'answers.*.correct' => 'required|boolean'
        ];
    }

目前我可能会错过添加一个正确答案,从而导致一个不可能的问题。

我检查了文档,看不到任何突出的东西。

任何帮助,将不胜感激。

编辑答案

我使用了这个(如答案所述):Laravel validate at at least one item in a form array

我设法创建了一个自定义规则,如下所示:

    public function passes($attribute, $value)
    {
        foreach ($value as $arrayElement) {
            if ($arrayElement['correct'] == true) {
                return true;
            }
        }

        return false;
    }

然后在我在我创建的新规则中添加的请求的现有规则()部分中:

'answers' => ['required', 'array', new ArrayAtLeastOneBoolTrue()],

标签: phplaravelvalidation

解决方案


您在这里验证数组答案是否具有:

  1. 一个最大的字符串。255 个字符(文本)
  2. 布尔值(正确)

要检查这个数组的完整性,Laravel 请求是检查错误的地方。从技术上讲,可以创建自己的验证规则,但在这里没有意义。相反,您应该在控制器中迭代此数组并验证每个答案的完整性。还有两个想法,要做得更好:

  • 不要在一个数组中发送所有答案以及是否正确回答。相反,在用户单击它的那一刻,将选定的答案发送到您的 api,每个答案都有一个请求。这将 1. 防止有人向您发送他回答 100% 正确的信息(如果这是一个学校软件,那就不好了:))和 2. 根据有多少问题,它会将发送到服务器的数据减少到最低限度,主要是因为...
  • ...似乎您将问题的整个文本发送到服务器以识别答案。每个问题使用一个唯一的 ID,并将其作为问题 ID + 选择或输入的答案发送。

编辑:感谢您的评论,对不起我的误解。如上所述,如果至少一个答案是正确的,那么自定义验证当然在这里检查每个问题是完全有意义的。看看这个:https ://stackoverflow.com/a/53791208/2264877


推荐阅读