【问题标题】:How to validate unique composite key of array data in laravel Validations如何在 laravel Validations 中验证数组数据的唯一复合键
【发布时间】:2020-05-09 18:01:58
【问题描述】:

请求数据

    {
        "exam_id": 10,
        "exam_scores": [
        {
          "student_id": 1,
          "subject_id": 1,
          "marks": 50,
        },
        {
          "student_id": 1,
          "subject_id": 2,
          "marks": 70,
        },
        {
          "student_id": 1,
          "subject_id": 3,
          "marks": 80,
        }
        ],

    }

其中 student_id 和 subject_id 是唯一的复合键, 如何使用接受数据数组的规则方法为复合键制作验证器() 我试过了,但它没有按预期工作。

$validator = Validator::make(request()->all(), [
    "exam_id"=> "required|integer",
    "exam_scores"=> "required|array",
    'exam_scores.*.student_id' => [
        Rule::unique('results')->where(function ($query) {
            return $query
                ->whereStudent_idAndSubject_id(request()->get('exam_scores.*.student_id'),request()->get('exam_scores.*.subject_id'))
        })
    ],
]);

以下请求不应验证数据。但它验证成功。

{
        "exam_id": 10,
        "exam_scores": [
        {
          "student_id": 1,
          "subject_id": 1,
          "marks": 50,
        },
        {
          "student_id": 1,
          "subject_id": 1,
          "marks": 70,
        }
       ],

    }

以下请求成功验证了具有预期的单个考试分数对象的数据。

    {
        "exam_id": 10,
        "exam_scores": {
            "student_id": 1,
            "subject_id": 1,
            "marks": 50,
        }
    }

$validator = Validator::make(request()->all(), [
    "exam_id"=> "required|integer",
    "exam_scores"=> "required|array",
    'exam_scores.student_id' => [
    Rule::unique('results')->where(function ($query) {
        return $query
            ->whereStudent_idAndSubject_id(request()->get('exam_scores.student_id'),request()->get('exam_scores.subject_id'))
    })
],
]);

【问题讨论】:

  • 你确定 whereStudent_idAndSubject_id。据我所知应该是 whereStudentIdAndSubjectId
  • 是的,字段命名约定运行良好。
  • 那么“它没有按预期工作”是什么意思?

标签: php laravel validation


【解决方案1】:

在搜索了很多博客、教程当然还有 laravel 文档之后,我得到了一些可以解决我的问题的东西,那就是博客链接。这不是我真正想要的,但它明确了我必须做什么的概念。 这家伙救了我的命。

Validate Dynamic request Values

这是一个例子。

namespace App\Http\Requests;    
use App\Http\Requests\Request;

class OrderRequest extends Request
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'name' => 'required|max:255',
        ];

        foreach ($this->request->get('items') as $key => $val) {
            $rules['items.' . $key] = 'required|max:10';
        }

        return $rules;
    }

    public function messages()
    {
        $messages = [];
        foreach ($this->request->get('items') as $key => $val) {
            $messages['items.' . $key . '.max'] = 'The field labeled "Book Title ' . $key . '" must be less than :max characters.';
        }
        return $messages;
    }

}

解决方案非常简单易行。

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 2015-05-19
    • 2020-04-24
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多