如何根据规则 Laravel 上的数组数据的参数添加条件?

Posted

技术标签:

【中文标题】如何根据规则 Laravel 上的数组数据的参数添加条件?【英文标题】:How can I add condition based on the parameters of the array data on the rules Laravel? 【发布时间】:2018-05-23 09:51:24 【问题描述】:

我使用 Laravel 5.3

我的 Laravel 规则是这样的:

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class AddCartRequest extends FormRequest

    public function rules()
    
        return [
            'product_id'=>'required|numeric',
            'delivery_address'=>'required',
            'request_delivery_at' => 'required|date_format:d-m-Y H:i:s|after:120 minutes'
        ];
    

echo '&lt;pre&gt;';print_r($this-&gt;request-&gt;get('delivery_address'));echo '&lt;/pre&gt;'; 的结果如下:

Array
(
    [sender_name] => chelsea
    [postal] => 12345
    [country] => japan
    [city] => tokyo
    [send_date] => 09-12-2017
    [send_time] => 
    [information] => test
)

我想变成这样:

如果send_time为空,request_delivery_at的规则如下:

'request_delivery_at' => 'required|date_format:d-m-Y H:i:s'

所以,没有|after:120 minutes

如果 send_time 是有值的(例如 send_time = 12:30:00),request_delivery_at 的规则如下:

'request_delivery_at' => 'required|date_format:d-m-Y H:i:s|after:120 minutes'

我该怎么做?

更新

我尝试这样:

public function rules()

    $send_time = $this->request->get('delivery_address')['send_time'];

    if($send_time)
        $validation_time = '|after:120 minutes';
    else
        $validation_time = '';  

    return [
        'product_id'=>'required|numeric',
        'delivery_address'=>'required',
        'request_delivery_at' => 'required|date_format:d-m-Y H:i:s'.$validation_time
    ];

好像有效

【问题讨论】:

由于您的要求非常复杂,您无法使用现有的验证规则来实现它,您必须创建自定义验证规则,我可以在 120 分钟后知道吗? @SuccessMan 看起来不错,可能想在尝试访问数组元素之前检查 var 是否为空...旁注:FormRequestRequest ... @987654330 @ $this-&gt;input() 等等 ...这是一个Illuminate\Http\Request ...您已经在请求的上下文中,$this-&gt;input('delivery_address') @lagbox,好的。感谢您的帮助 【参考方案1】:

您的问题对我来说不是很清楚,据我所知,您希望有条件验证规则,基于交货地址数组中存在的发送时间,

您可以通过创建自己的验证规则或在控制器中添加有条件的验证检查来实现这一点,

控制器方法例:

if(!$request->has('delivery_address.send_time'))
    $rules = [

    ];

    $messages = [


    ];

    $validator = Validator::make($request->all(),$rules,$messages);
    if($validator->fails())
        $this->throwValidationException($request,$validator);
    
else
  $rules = [

    ];

    $messages = [


    ];

    $validator = Validator::make($request->all(),$rules,$messages);
    if($validator->fails())
        $this->throwValidationException($request,$validator);
    


或者您可以参考我的以下关于如何制定自定义验证规则的答案。 Date Compare in validation Laravel 5.2

【讨论】:

我找到了简单的解决方案。看看我的更新问题 OP 正在使用表单请求

以上是关于如何根据规则 Laravel 上的数组数据的参数添加条件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.6 中调用数组上的成员函数 links()

如何防止 Laravel API 处理查询字符串上的参数?

如何根据输入请求规则在 laravel 刀片中显示错误消息

在 Laravel 中验证数组时,如何使用数组项规则添加验证自定义消息?

如何使唯一数组的自定义验证规则依赖于其他字段 laravel

如何在 Laravel 中使用 setter 方法设置验证规则?