【问题标题】:Validate unique name and firstname in Laravel验证 Laravel 中的唯一名称和名字
【发布时间】:2025-12-20 04:35:07
【问题描述】:

我知道该主题存在,但到目前为止我还没有找到解决方案。我有一个名为 players 的表,其中包含两个字段:name, firstname. 我的目标是在输入多个条目时不重复。

我想得到这个结果。

Fostier | Alain 
Fostier | Jeremy 

如果我有两次 福斯蒂尔 |阿兰这是不正确的。

重复系统应该只结合ID?我尝试了以下但没有成功。

public function store(Request $request)
{
    $request->validate([
        'name' => 'required|unique:players,name',
        'firstname' => 'required|unique:players,firstname',

    ]);
    Player::create($request->all());

    flashy('Valider');

    return redirect()->route('players.index')
        ->with('success', 'save');
}

【问题讨论】:

  • 开箱即用,unique 方法不处理连接/复合列。这将需要一些自定义逻辑,例如对具有该名字/姓氏的玩家执行单独的查询,或者在您的桌子上存储一个 slug 并在您的 unique 规则中引用它等等。
  • @TimLewis 评论不适用于答案或部分答案。这似乎可以通过一些工作变成一个不错的答案。
  • @J.A.Streich 你是对的,但我的评论并不是一个真正的答案;它是关于可用不同方法的更多指南。将其变成答案需要大量工作,这属于“过于宽泛”的密切原因。我会把它作为评论留下,如果用户想尝试其中一个,他们可以自行关闭或更新任何新的、更具体的错误。
  • @Tim Lewis:谢谢你的解释。

标签: laravel


【解决方案1】:

您可以使用Illuminate\Validation\Rule 类进行复合检查,例如:

use Illuminate\Validation\Rule;
...

$request->validate([
    'name' => ['required', Rule::unique('players', 'name')->where(function ($query) use ($request) {
        return $query->where('name','!=', $request->input('firstname'));
    })],
    'firstname' => ['required', Rule::unique('players', 'firstname')->where(function ($query) use ($request) {
        return $query->where('firstname', '!=', $request->input('name'));
    })],
]);

这通过检查“名字”是否正在使用来检查“名字”的唯一性,并且对“名字”检查“名字”也是如此。

【讨论】:

  • 非常感谢 :-)