required_if Laravel 5验证

63

我有一个表单,用户可以填写以出售他们的房屋。对于其中的一个输入,用户必须选择是“待售”还是“待租”。如果是待售,将出现两个价格输入字段;如果是待租,则会根据jQuery显示其他价格输入字段。

我的问题是,我希望这些价格字段为必填,但例如,如果我选择了“待租”,然后提交表单,它会给我一个错误,指出需要“待售”输入字段的价格字段,即使它在“待租”部分下。

我知道Laravel中有一个“required_if”,但我不知道如何使用它。这是我的财产请求。

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class PropertyRequest 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()
    {
        return [
            'list_type' => 'required',
            'sale_price' => 'required', // <-- maybe like: required_if:value
            'rent_price' => 'required',   
        ];
    }
}

/****************** 编辑 ***************************/

我现在拥有的:

 public function rules()
    {
        return [
            'list_type'  => 'required',
            'sale_price' => 'required_if:list_type:For Sale',
            'rent_price' => 'required_if:list_type:For Rent',
    }

但是当我提交表单时,会出现这个错误:

我的错误


好的查找位置是测试文件(v5.6): https://github.com/laravel/framework/blob/681438e78a1ccc5462cfa20e0e724befbb9269a1/tests/Validation/ValidationValidatorTest.php#L880 - Juddling
5个回答

157

假设list_type是选择框的名称(值为:selling或rent)

使用方法如下:

"sale_price" => "required_if:list_type,==,selling"

这是什么意思?

如果list_type的值等于selling,则只需要提供销售价格。

对于rent_price,也要做同样的操作。

编辑

public function rules()
{
  return [
   'list_type'  => 'required',
   'sale_price' => 'required_if:list_type,==,For Sale',
   'rent_price' => 'required_if:list_type,==,For Rent'
}

检查我的编辑,我犯了一个错误,请尝试现在,如果这样不行,请添加"==",像这样 sale_price" => "required_if:list_type,==,selling" - Achraf Khouadja
1
您的评论中的“编辑”部分已经生效。谢谢。 - David
以上的代码不相关,因为使用 list_type => required,就没有必要编写后续的 2 条验证规则了,因为它们始终是必需的,并且 list_type 也是 required 而不是 sometimes - priMo-ex3m
@lura Varzari,我不太明白你的意思,接下来的两个验证规则取决于第一个“list_type”的值:) 如果“list_type ==“出售”,那么必须有一个“sale_price”字段,否则如果是出租,则必须有一个“rent_price”字段。 - Achraf Khouadja
2
你节省了我的时间@AchrafKhouadja,谢谢! - Tithira

21

您可以直接使用Illuminate\Validation\Rules\RequiredIf规则。

注意:此规则适用于Laravel 5.6及更高版本。

class SomeRequest extends FormRequest
{
    ...
    public function rules()
    {
        return [
            'sale_price' => new RequiredIf($this->list_type == 'For Sale'),
            'rent_price' => new RequiredIf($this->list_type == 'For Rent'),
        ];
    }
}

如果您需要使用多个规则,则可以传递一个数组。

public function rules()
{
    return [
        'sale_price' => [
            new RequiredIf($this->list_type == 'For Sale'),
            'string',
            ...
        ]
    ];
}


当您的验证逻辑位于扩展自Illuminate\Foundation\Http\FormRequest类的类中时,请使用此方法。 - TiagoA
3
仅供参考,这在提问时并不存在,它是在后来的 Laravel 版本中引入的。 - Achraf Khouadja

13

如果另一个字段不存在,可能会出现需要该要求的情况。如果某人处于这种情况下,则可以执行以下操作。

'your_field.*' => 'required_unless:dependency_field.*,

8
您可以像以下这样在Laravel中使用Illuminate\Validation\Rule构建验证器。
$validator =  Validator::make( $request->input(), [
    'list_type' => 'required',
    'sale_price'=> Rule::requiredIf( function () use ($request){
        return $request->input('list_type') == 'For Sale';
    }),
    'rent_price'=> Rule::requiredIf( function () use ($request){
        return $request->input('list_type') == 'For Rent';
    }),
]);

4

对于我来说,在使用 required_if 这个函数时,需要检查两个值,我的写法如下:

return [
        'change_status' => 'required',
        'forward_to' => 'required_if:change_status,2,3'
    ];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接