要使用unique rule 的except 子句,我们需要在规则本身中直接提供我们希望规则忽略的记录字段的值 .
因此,如果我们希望在请求更新的记录上除了的每条记录都有一个唯一的 name 字段,我们需要添加 ID 字段的值以忽略:
class UpdateShopRequest extends FormRequest
{
...
public function rules()
{
return [
'shop.name' => 'unique:shops,name,' . $this->shop['id'],
];
}
}
如图所示,如果任何行包含相同的商店名称,此规则将导致验证失败除非该行的 id 匹配 $this->shop['id']。此示例假设我们的表单包含记录 ID 属性的 nested input field,因为此特定问题正在对数组输入执行验证:
<input type="hidden" name="shop[id]" value="{{ $shop->id }}">
...这让我们可以像处理任何其他请求一样获取请求中的值。
但是,大多数表单不包含数组,因此——在其他情况下——验证规则可能会直接引用输入字段(没有嵌套标识符):
'name' => 'unique:shops,name,' . $this->id,
更典型的是,我们将记录 ID 作为路由参数传递,我们可以使用请求的 route() 方法检索它:
'name' => 'unique:shops,name,' . $this->route('id'),
...如果我们的路由定义类似于:
Route::post('shops/{id}', ...);
unique 验证规则的第四个参数让我们指定 except 子句适用于哪一列,默认为 id,因此如果我们只是比较记录的 ID,我们可以不使用它。
当我们只是连接列值时,规则看起来有点笨拙,尤其是对于具有许多其他规则的字段。从 5.3 版本开始,Laravel 提供了更优雅的语法来创建带有 except 子句的 unique 规则:
use Illuminate\Validation\Rule;
...
return [
'name' => [
'required',
'string',
'max:100',
Rule::unique('shops', 'name')->ignore($this->id, 'optional_column'),
],
];