You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel验证:如何确保至少一个邮箱字段有效?

Laravel验证:确保至少一个邮箱字段有效

我有一个包含mail和mail2两个字段的数组,要求至少其中一个字段填写有效的邮箱地址。示例数组如下:

$data = [
 'mail' => 'firstname.lastname#tld.com',
 'mail2' => 'firstname.lastname@tld.com',
 // 其他字段
];

我试过用exclude_with规则做验证,但只有当mail无效但mail2有效时验证能通过,反过来就不行。我的尝试代码:

$validated = Validator::make($data, [
    'mail' => 'exclude_with:mail|email',
    'mail2' => 'exclude_with:mail2|email',
])->validate();

我可以用其他PHP方法或正则实现需求,但想知道仅通过Laravel验证器能不能完成——核心目标是确保至少一个字段是有效邮箱,否则验证失败。

更新

按照Abdulla的回答测试后发现,当第一个邮箱有效但第二个无效时,验证还是失败了:

测试数据:

$data = [
     'mail' => 'firstname.lastname@tld.com', // 有效邮箱
     'mail2' => 'firstname.lastname#tld.com' // 无效邮箱
 ];

验证代码:

$validator = Validator::make($data, [
     'mail' => 'exclude_unless:mail2,null|email',
     'mail2' => 'exclude_unless:mail,null|email',
 ]);

错误输出:

mail2必须是有效的邮箱地址。

正确的Laravel验证方案

要实现「至少一个字段为有效邮箱」的需求,你可以结合required_without规则和email规则,同时搭配nullable允许字段为空(如果业务允许字段不填的话):

$validated = Validator::make($data, [
    'mail' => 'nullable|email|required_without:mail2',
    'mail2' => 'nullable|email|required_without:mail',
])->validate();

规则说明:

  • nullable:允许字段值为null或空字符串
  • email:验证字段是否为有效邮箱格式
  • required_without:mail2:当mail2不存在或为空时,mail必须存在且有效;required_without:mail同理

这套规则能覆盖所有符合需求的场景:

  • mail有效,mail2无效/空
  • mail2有效,mail无效/空
  • 两个字段都有效(同样符合要求)

如果你的业务不允许两个字段都为空,直接去掉nullable即可,这样会强制要求至少填写一个有效邮箱:

$validated = Validator::make($data, [
    'mail' => 'email|required_without:mail2',
    'mail2' => 'email|required_without:mail',
])->validate();

内容的提问来源于stack exchange,提问作者lordisp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:10:45