根据路由绑定模型验证输入参数

时间:2019-07-02 16:30:30

标签: php validation laravel-5

我有一个关于验证的小问题。 有一个api路由POST /api/document/{document}/link,它接受​​一个文档ID数组({"ids": [1, 2, 3]}),该ID链接到绑定到该路由的Document。我按如下方式验证此数组

public function rules()
    {
        return [
            'ids' => 'required|array',
            'ids.*' => 'numeric|exists:documents,id'
        ];
    }

问题在于文档模型具有partner属性,并且不可能将来自不同合作伙伴的文档链接在一起。我要检查的是(通过其ID)传递的文档是否与绑定文档属于同一伙伴。我想在FormRequest中对此进行验证。有可能吗?

2 个答案:

答案 0 :(得分:0)

您可以将这些用于您的规则:

'ids' => [
    'required',
    'array'
],
'ids.*' => [
    'required',
    'exists:documents,id'

],
'ids.*.partner_id' => [
    Rule::in([$document->partner_id])
]

这将验证您的ID是否与数组中的数字匹配,因为我们仅将ID $document中给出的路由中的ID放在其中,否则该ID应该匹配或返回失败。

答案 1 :(得分:0)

所以,这就是我的结论:

public function rules()
    {
        /** @var Document $document */
        $document = $this->route('document');

        return [
            'ids' => ['required', 'array'],
            'ids.*' => ['required', 'numeric', Rule::exists('documents','id')->where('partner_id', $document->partner_id)],
        ];
    }

事实证明,此案在https://laravel.com/docs/5.8/validation#rule-exists的Laravel文档中进行了描述。我只需要自定义执行的查询,以确保传递的idpartner_id都存在。