Laravel 对多列的唯一验证

新手上路,请多包涵

我在表服务器中有 2 列。

我有列 iphostname

我有验证:

 'data.ip' => ['required', 'unique:servers,ip,'.$this->id]

这仅适用于 ip 列。但是如何做到这一点,对于列 hostname

我想用 iphostname 列验证 data.ip。因为当用户写 ip 时,ip 和 hostname 列中可以重复。

原文由 Dumitru 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 383
2 个回答

您可以使用 Rule::unique 来实现您的验证规则

$messages = [
    'data.ip.unique' => 'Given ip and hostname are not unique',
];

Validator::make($data, [
    'data.ip' => [
        'required',
        Rule::unique('servers')->where(function ($query) use($ip,$hostname) {
            return $query->where('ip', $ip)
            ->where('hostname', $hostname);
        }),
    ],
],
$messages
);

编辑:固定消息分配

原文由 Niklesh Raut 发布,翻译遵循 CC BY-SA 4.0 许可协议

这对我来说适用于创建和更新。

在您的 ServerUpdateRequest 或 ServerCreateRequest 类中

public function rules()
{
    return [
       'column_1' => 'required|unique:TableName,column_1,' . $this->id . ',id,colum_2,' . $this->column_2 . ',colum_3,' . $this->column_3,
    ];
}

此命令在后台运行这样的聚合 Sql

 select
   count(*) as aggregate
from
  `TableName`
where
  `column_1` = <postedColumn1Value>
   and `id` <> idValue
   and `column_2` = <postedColumn2Value>
   and `column_3` = <postedColumn3Value>

在 Laravel 9 中测试。它可以工作

注意:如果要查看后台sql进行调试(例如,检查请求值是否为空[$this->]),尤其是您必须编写错误的代码,例如,您可能输入错误的文件名。

原文由 blackmamba 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题