【问题标题】:Laravel Validation Array must contain one item where boolean is trueLaravel 验证数组必须包含一个布尔值为真的项目
【发布时间】:2020-10-20 04:29:43
【问题描述】:

我正在验证问题和答案(用于创建测试)。我想确保 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 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()],

【问题讨论】:

  • 我肯定会检查自定义验证器。您可以为您的 answers 数组创建一个验证器,它应该检查以确保给出了一个数组,其中至少包含两个元素,并且至少一个(并且只有一个,如果不是多选)答案必须为真。

标签: php laravel validation


【解决方案1】:

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

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

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

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

编辑:感谢 cmets,抱歉我的误解。如上所述,如果至少有一个答案是正确的,那么自定义验证当然可以在这里检查每个问题。看看这个:https://stackoverflow.com/a/53791208/2264877

【讨论】:

  • 根据解释,他们询问使用 Laravel 来创建测试。这就是提交完整问答数据的原因。将他们视为教师,而不是学生。
  • 对我来说,这看起来更像是用一组答案创建问题的请求。 OP 正试图确保他们的问题至少有一个正确答案。这就是为什么他们提到“不可能”的问题,如果没有答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 2021-12-24
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多