- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Laravel 有一个带有“异常(exception)”子句的“独特”规则。从验证文档来看,它采用以下形式:
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 没有被注入(inject)到表单请求中。我可以将 id
作为另一个表单值注入(inject),但这似乎不起作用。
如何让此规则在表单请求中发挥作用?
最佳答案
使用 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']
。此示例假设我们的表单包含 nested input field对于记录的 ID 属性,因为这个特定问题正在对数组输入执行验证:
<input type="hidden" name="shop[id]" value="{{ $shop->id }}">
...这让我们可以像处理任何其他请求一样获取请求中的值。
但是,大多数表单不包含数组,因此在其他情况下,验证规则可能会直接引用输入字段(没有嵌套标识符):
'name' => 'unique:shops,name,' . $this->id,
更典型的是,我们将记录 ID 作为路由参数传递,我们可以使用请求的 route()
方法检索该记录 ID:
'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'),
],
];
关于php - Laravel:如何在表单请求验证中使用忽略规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47646900/
我是一名优秀的程序员,十分优秀!