【问题标题】:Laravel 5.6 - update unique attributeLaravel 5.6 - 更新唯一属性
【发布时间】:2018-11-23 15:28:48
【问题描述】:

我有一个名为 JuridicoFormRequest 的表单请求,其方法是“规则”:

public function rules() {
  $rules = [
      'rif'=>'required|max:40|unique:juridico,rif',
      'correo'=>'required|max:40|unique:juridico,correo',
      'd_social'=>'required|max:50',
      'r_social'=>'required|max:50',
      'pagina_web'=>'max:40|unique:juridico,pagina_web',
      'capital'=>'required|numeric',
      'fk_lugar'=>'required|integer',
      'fk_lugar_fiscal'=>'required|integer',
      'fk_tienda'=>'integer',
      'num_carnet'=>'max:50'
 ];
 if ($this->juridico){
    $rules['rif'] = 'required|max:40';
    $rules['correo'] = 'required|max:40';
    $rules['pagina_web'] = 'required|max:40';
 }
 return $rules;
}

问题是在数据库中,“Correo”属性必须是唯一的,对于“pagina_web”也是如此。当我尝试更新某个注册表“A”并编写另一个注册表“B”的相同“Correo”或另一个注册表的相同“pagina_web”时,会引发错误。 “rif”不会发生这种情况,因为它是主键,我已经使用以下方法对其进行了验证:

if ($this->juridico) {  /*....*/  }

如果我这样做:

if ($this->juridico) {  
 $rules['rif'] = 'required|max:40';
 $rules['correo'] = 'required|max:40|unique:juridico,correo';
 $rules['pagina_web'] = 'required|max:40|unique:juridico,pagina_web';
}

向我抛出验证消息(不是例外)“correo 必须是唯一的”,而该“correo”和“pagina_web”已被我正在更新的注册表占用。

有没有办法解决这个问题?

更新:我是这样解决的:

public function rules(){

      $rules = [
          'rif'=>'required|max:40|unique:juridico,rif',
          'correo'=>'required|max:40|unique:juridico,correo',
          'd_social'=>'required|max:50',
          'r_social'=>'required|max:50',
          'pagina_web'=>'max:40|unique:juridico,pagina_web',
          'capital'=>'required|numeric',
          'fk_lugar'=>'required|integer',
          'fk_lugar_fiscal'=>'required|integer',
          'fk_tienda'=>'integer',
          'num_carnet'=>'max:50'
      ];


     if ($this->juridico){
        $rules['rif'] = 'required|max:40';
        $rules['correo'] = 'required|max:40|unique:juridico,correo,'.$this->juridico.',rif';
        $rules['pagina_web'] = 'required|max:40|unique:juridico,pagina_web,'.$this->juridico.',rif';
     }

      return $rules;
  }

【问题讨论】:

  • $rules['correo'] = 'required|max:40|unique:correos',
  • 我不工作,因为如果我在更新时不更改“correo”或“pagina_web”,将向我抛出验证消息“correo must be unique”或“pagina_web” must be unique
  • 查看我的帖子回答
  • 您使用的规则强制您在字段中编写与数据库中已有内容不同的内容。因此,如果您输入数据库中已有的数据,您将收到验证错误。这就是它的作用,这是你想要的还是?这个应用程序的实际用途是什么?
  • 是的,但是,我正在更新的注册表已经是那个 "correo" 和那个 "pagina_web" 的所有者,为什么每次我想更新它都应该不同?

标签: php laravel laravel-5.6


【解决方案1】:
use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

如果你的表使用了除id以外的主键列名,你可以在调用ignore方法时指定列名:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')

你可以自定义它!

【讨论】:

    【解决方案2】:

    参见文档https://laravel.com/docs/5.5/validation#rule-unique

    $rules['correo'] = 'required|max:40|unique:juridico,correo,pagina_web';
    

     $rules['correo'] = [
        'required',
        'max:40',
        Rule::unique('juridico')->where(function ($query) use ($paginaWeb) {
           return $query->where('pagina_web', $paginaWeb);
        })
    ];
    

    在 AppServiceProvider 中添加这个

    public function boot()
    {
        Validator::extend('uniq', function ($attribute, $value, $parameters, $validator) {
            $data = $validator->getData();
            $tableName = $parameters[0];
            unset($parameters[0]);
            $primaryKey = 'id';
    
            $query = DB::table($tableName);
            // set main uniqueness condition
            $query->where($attribute, '=', $value);
            // if primary key exists - set to NOT be equal (for updating case)
    
            if (!empty($data[$primaryKey])) {
                $query->where($primaryKey, '!=', $data[$primaryKey]);
            }
    
            // check conditional columns
            if (!empty($parameters)) {
                foreach ($parameters as $column) {
                    if (isset($data[$column])) {
                        $query->where($column, '=', $data[$column]);
                    }
                }
            }
            $count = $query->count();
            return ($count == 0) ? true : false;
        });
    }
    

    和用法

    $rules['correo'] = 'required|max:40|uniq:juridico,correo,pagina_web';
    

    【讨论】:

    • 对不起,但对我不起作用。向我抛出验证消息“correo 必须是唯一的”,而“correo”已经被我正在更新的注册表占用。我的桌子也被称为“juridico”
    • 你用过required|max:40|unique:juridico,correo,pagina_web吗??
    • 如果您在 $data 中更新了 primary-key => value
    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多