首页 > 解决方案 > Laravel 验证:仅当另一个元素不存在时,如何将数组中的元素元素标记为必需

问题描述

我的 api 在帖子中接受一组收件人。

每个收件人都必须有电子邮件或电话,但不能同时拥有。

我试过这个

'recipients'    => 'required|array|min:1',
    'recipients.*.email'     => 'required_without:recipients.*.phone',
    'recipients.*.phone'     => 'required_without:recipients.*.email',

问题是必须丢弃以下内容,但对 laravel 有效

{
  recipients: [
      'email': 'a'
      'phone: 'b'
  ]
}

如果有电子邮件,则不能是电话,反之亦然。

标签: laravelvalidation

解决方案


您可以使用required_unless验证器。

文档

但是你有一个更大的问题是你正在验证一个数组。因此,在数组中使用星号“*”并不是一个简单的情况,因为您需要检查每个收件人的电话/电子邮件,而不是任何收件人。

所以也许是这样的。

$rules = [
    'recipients'         => 'required|array|min:1'
];

for($i = 0; $i < count(request('recipients')); $i++) {
    $rules['recipient.' . $i . '.email'] = 'required_unless:recipient.' . $i . '.phone';
    $rules['recipient.' . $i . '.phone'] = 'required_unless:recipient.' . $i . '.email';
}

return $rules;

推荐阅读