Laravel:如何在表单请求验证中使用忽略规则

时间:2017-12-05 05:51:03

标签: php laravel validation laravel-validation

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作为另一个表单值注入,但这似乎不起作用。

如何在表单请求中使用此规则?

3 个答案:

答案 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')],
    ];
  }
}