Laravel有一个'unique'规则,带有'except'子句。从验证文档中,它采用以下形式:
unique:table,column,except,idColumn
我的应用程序有一个“商店”实体。当用户更新商店的个人资料时,我有一个表单请求,其验证规则配置如下:
public function rules()
{
return [
'shop.name' => 'required|string|max:100|unique:shops,name,except,id',
];
}
(我的shops
表上的主键是id
)。
问题是Laravel没有注意到'except'条款。这是有道理的(因为商店ID没有注入表单请求)。我可以将id
作为另一个表单值注入,但这似乎不起作用。
如何在表单请求中使用此规则?
答案 0 :(得分:8)
要将except
子句用于unique
规则,我们需要在记录中提供我们希望规则忽略的值 直接在规则本身。
因此,如果我们想要在请求更新的记录上为除之外的每条记录添加唯一的name
字段,我们需要添加要忽略的ID字段的值: / p>
class UpdateShopRequest extends FormRequest
{
...
public function rules()
{
return [
'shop.name' => 'unique:shops,name,' . $this->shop['id'],
];
}
}
如图所示,如果任何行包含相同的商店名称,则此规则将导致验证失败,除非行的id
匹配$this->shop['id']
。此示例假定我们的表单包含记录的ID属性的数组输入字段,因为问题是对数组输入执行验证:
<input type="hidden" name="shop[id]" value="{{ $shop->id }}">
...它允许我们像任何其他请求一样获取请求中的值。更典型的是,我们将记录ID作为路由参数传递,我们可以使用请求的route()
方法检索该参数:
$shopId = $this->route('id');
...如果我们的路线定义类似于:
,则有效Route::post('shops/{id}', ...);
unique
验证规则的第四个参数可让我们指定except
子句适用的列,默认为id
,因此我们可以将其关闭比较记录的ID。
当我们仅连接列值时,规则看起来有点笨拙,特别是对于具有许多其他规则的字段。从5.3版开始,Laravel提供了更优雅的语法来创建带有unique
子句的except
规则:
use Illuminate\Validation\Rule;
...
return [
'shop.name' => [
'required',
'string',
'max:100',
Rule::unique('shops', 'name')->ignore($shopId, 'optional_column'),
],
];
答案 1 :(得分:2)
此示例假定我们的表单包含记录的ID属性的数组输入字段,因为问题是对数组输入执行验证:
<input type="hidden" name="shop[id]" value="{{ $shop->id }}">
Laravel 5.8:我已经尝试了您的解决方案,未添加输入,它运行良好。因为Laravel将Shop对象传递到请求中(用dd()显示为rules())
只是:
`public function rules()
{
return [
'name' => 'unique:shops,name,'.$this->shop->id
];
}`
答案 2 :(得分:0)
对于 laravel 8 使用 $this->get('id') 来排除当前记录以供品尝
use Illuminate\Foundation\Http\FormRequest;
class Update extends FormRequest
{
public function rules()
{
return [
'name' => ['required', 'string', 'unique:shops,slug,'. $this->get('id')],
];
}
}