【问题标题】:Laravel: How to use the ignore rule in Form Request ValidationLaravel:如何在表单请求验证中使用忽略规则
【发布时间】:2018-05-18 17:13:18
【问题描述】:

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

如何让这个规则在表单请求中起作用?

【问题讨论】:

    标签: php laravel validation laravel-validation


    【解决方案1】:

    要使用unique ruleexcept 子句,我们需要在规则本身中直接提供我们希望规则忽略的记录字段的 .

    因此,如果我们希望在请求更新的记录上除了的每条记录都有一个唯一的 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'), 
        ],
    ];
            
    

    【讨论】:

    • 谢谢 Cy,这是一个很好的解释......我忽略了表单请求仍然只是一个请求的事实!
    • 试图获取非对象的属性 'id'
    【解决方案2】:

    此示例假设我们的表单包含记录 ID 属性的数组输入字段,因为问题正在对数组输入执行验证: &lt;input type="hidden" name="shop[id]" value="{{ $shop-&gt;id }}"&gt;

    Laravel 5.8:我现在已经尝试过你的解决方案,没有添加输入,它运行良好。因为 Laravel 将 Shop 对象传递到请求中(显示为 dd() 到 rules() )

    只是:

    `public function rules()
    {
        return [
            'name' => 'unique:shops,name,'.$this->shop->id
        ];
    }`
    

    【讨论】:

    • Romain,我的回答中的&lt;input&gt; 只是示例的说明。真正的应用程序可能会有不同的设置。我只是想通过显示一个可能在表单请求对象中产生值的基本字段来提供一些上下文。
    【解决方案3】:

    对于 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')],
        ];
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 1970-01-01
      • 2015-05-01
      • 2017-06-13
      • 1970-01-01
      • 2020-07-17
      • 2020-09-13
      • 2017-12-06
      • 1970-01-01
      相关资源
      最近更新 更多