如何在 laravel 验证中验证阵列数据的唯一复合键

请求数据


    {

        "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_scores成功验证数据。


    {

        "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'))

    })

],

]);


MMTTMM
浏览 87回答 1
1回答

呼如林

在搜索了许多博客,教程,当然还有laravel文档之后,我得到了一些解决我的问题是博客链接的东西。这不是我真正想要的,但它清楚地说明了我必须做什么的概念。这个家伙拯救了我的一天。验证动态请求值下面是一个示例。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;    }}解决方案非常简单易行。
打开App,查看更多内容
随时随地看视频慕课网APP